无法使用SimpleXML读取XML

时间:2011-06-07 18:35:24

标签: php xml simplexml

我通过cUrl收到一个用PHP生成的XML代码:

$c = curl_init("http://www.domain.com/script.php");
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    $xmlstr = curl_exec($c);

如果我回显$ 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>

哪个是正确的,并且在脚本中生成了相同的内容。但是,如果我尝试执行以下操作

$xml = simplexml_load_string($xmlstr);
    if (!is_object($xml))
        throw new Exception('Reading XML error',1001);
    echo $xml->e1->minutos;

不显示任何内容,print_r对象打印一个空对象。可能有什么不对?

2 个答案:

答案 0 :(得分:5)

您有两个主要问题,首先您没有考虑任何名称空间(例如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!

您还可以对值进行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];

值得一提的是,PHP手册包含basic usage examples,涵盖了如何遍历XML结构以及children()registerXPathNamespace()的特定页面,向您展示如何使用命名空间元素实例

最后,正如您所看到的,print_r() / var_dump()与SimpleXML的输出并不总是非常有用!查看所得内容的最佳方法是回显saveXML(),它将显示给定元素的XML。

答案 1 :(得分:0)

试试children method

foreach ($xml->children("soap", true) as $k => $v) {
    echo $k . ":\n";
    var_dump($v);
}