2011-06-07 58 views
1

我經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對象打印一個空對象。什麼可能是錯的?

+0

當你var_dump($ xml)''時,你會得到什麼? – 2011-06-07 18:39:00

+0

object(SimpleXMLElement)#1(0){}但字符串是好的,並且如果保存爲XML在每個瀏覽器中都能很好地解釋。 – 2011-06-07 18:45:42

回答

4

你有兩個主要問題,一是你沒有考慮任何命名空間(如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

非常感謝!我真的不喜歡解析XML,讀取的例子沒有顯示這種XML,所以我認爲它們是一樣的。 – 2011-06-07 19:19:55

0

嘗試children method

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

這就是它所顯示的:Body:object(SimpleXMLElement)#4(0){} object(SimpleXMLElement)#1(0){} – 2011-06-07 18:53:21