我通过cUrl收到一个用PHP生成的XML代码:
$c = curl_init("http://www.domain.com/script.php");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$xmlstr = curl_exec($c);
Run Code Online (Sandbox Code Playgroud)
如果我回显$ xmlstr变量,它会显示以下内容:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<XGetPasoParadaREGResponse xmlns="http://tempuri.org/">
<XGetPasoParadaREGResult>
<PasoParada><cabecera>false</cabecera>
<e1>
<minutos>1</minutos>
<metros>272</metros>
<tipo>NORMAL</tipo>
</e1>
<e2>
<minutos>7</minutos>
<metros>1504</metros>
<tipo>NORMAL</tipo>
</e2><linea>28
</linea>
<parada>376</parada>
<ruta>PARQUE ALCOSA</ruta>
</PasoParada>
</XGetPasoParadaREGResult><status>1</status></XGetPasoParadaREGResponse>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
哪个是正确的,并且在脚本中生成的相同.但是,如果我尝试执行以下操作
$xml = simplexml_load_string($xmlstr);
if (!is_object($xml))
throw new Exception('Reading XML error',1001);
echo $xml->e1->minutos;
Run Code Online (Sandbox Code Playgroud)
不显示任何内容和print_r对象打印一个空对象.可能有什么不对?
您有两个主要问题,首先您没有考虑任何名称空间(例如soap),其次您没有遍历XML层次结构以获取所需的元素.
"简单"的方式是:
$minutos = (int) $xml
->children('soap', TRUE) // <soap:*>
->Body // <soap:Body>
->children('') // <*> (default/no namespace prefix)
->XGetPasoParadaREGResponse // <XGetPasoParadaREGResponse>
->XGetPasoParadaREGResult // <XGetPasoParadaREGResult>
->PasoParada // <PasoParada>
->e1 // <e1>
->minutos; // <minutos> yay!
Run Code Online (Sandbox Code Playgroud)
您还可以对值进行XPath查询:
// Our target node belongs in this namespace
$xml->registerXPathNamespace('n', 'http://tempuri.org/');
// Fetch <minutos> elements children to <e1>
$nodes = $xml->xpath('//n:e1/n:minutos');
// $nodes will always be an array, get the first item
$minutos = (int) $nodes[0];
Run Code Online (Sandbox Code Playgroud)
对于它的价值,PHP手册包含基本用法示例,涵盖如何遍历XML结构和特定页面,children()并向registerXPathNamespace()您展示如何使用示例处理命名空间元素.
最后,正如您所看到的,来自print_r()/ var_dump()使用SimpleXML 的输出并不总是非常有用!查看您所获得的内容的最佳方式是回显saveXML()哪个将显示给定元素的XML.
| 归档时间: |
|
| 查看次数: |
2322 次 |
| 最近记录: |