无法使用SimpleXML读取XML

Ant*_*una 1 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);
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对象打印一个空对象.可能有什么不对?

sal*_*the 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!
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.