不能用SimpleXML

我经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。

回答:

尝试children method:

foreach ($xml->children("soap", true) as $k => $v) { 

echo $k . ":\n";

var_dump($v);

}

以上是 不能用SimpleXML 的全部内容, 来源链接: utcz.com/qa/262673.html

回到顶部