• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

不能用SimpleXML

php 来源:Antonio Laguna 3次浏览

我经Curl接收与PHP与此代码生成的XML读取XML:不能用SimpleXML

$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对象打印一个空对象。什么可能是错的?


===========解决方案如下:

你有两个主要问题,一是你没有考虑任何命名空间(如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()的特定页面向您展示了如何使用带有示例的名称空间元素。

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)