2014-10-26 112 views
0

我有一個測試文件,我試圖用SimpleXML的xpath方法分析一個xml字符串。xml xpath不返回節點值

當我嘗試直接使用xpath訪問節點值時,我得到空輸出,但是當我使用xpath抓取元素並通過它們循環時,它工作正常。

當我看文檔時,似乎我的語法應該工作。有什麼我失蹤?

<?php 

$xmlstring = '<?xml version="1.0" encoding="iso-8859-1"?> 
<users> 
    <user> 
    <firstname>Sheila</firstname> 
    <surname>Green</surname> 
    <address>2 Good St</address> 
    <city>Campbelltown</city> 
    <country>Australia</country> 
    <contact> 
     <phone type="mobile">1234 1234</phone> 
     <url>http://example.com</url> 
     <email>[email protected]</email> 
    </contact> 
    </user> 
    <user> 
    <firstname>Bruce</firstname> 
    <surname>Smith</surname> 
    <address>1 Yakka St</address> 
    <city>Meekatharra</city> 
    <country>Australia</country> 
    <contact> 
     <phone type="landline">4444 4444</phone> 
     <url>http://yakka.example.com</url> 
     <email>[email protected]</email> 
    </contact> 
    </user> 
</users>'; 


// Start parsing 
if(!$xml = simplexml_load_string($xmlstring)){ 
    echo "Error loading string "; 
} else { 
    echo "<pre>"; 

    // Print all firstname values directly from xpath 
    // This outputs the elements, but the values are blank 
    print_r($xml->xpath("https://stackoverflow.com/users/user/firstname")); 

    // Set a variable with all of the user elements and then loop through and print firstname values 
    // This DOES output the values 
    $users = $xml->xpath("https://stackoverflow.com/users/user"); 
    foreach($users as $user){ 
     echo $user->firstname; 
    } 

    // Find all firstname values by tag 
    // This does not output the values 
    print_r($xml->xpath("//firstname")); 
    echo "</pre>"; 
} 
+0

位混淆。結果將返回所有三個查詢。你只是無法獲取數據嗎? – rjdown 2014-10-26 18:55:39

回答

0

作爲每手動http://uk1.php.net/manual/en/simplexmlelement.xpath.php

中的XPath方法搜索兒童匹配XPath路徑的SimpleXML節點。

在第一個和第三個示例中,您將返回包含節點值的數組的對象,而不是節點本身。所以你無法做到如

$results = $xml->xpath("//firstname"); 
foreach ($results as $result) { 
    echo $result->firstname; 
} 

相反,您可以直接回顯該值。那麼,幾乎直接(他們仍然是simplexml對象)...

$results = $xml->xpath("//firstname"); 
foreach ($results as $result) { 
    echo $result->__toString(); 
} 
+0

好的。我認爲使用'print_r'會打印孩子及其值。我只是計劃解析你的建議。謝謝! – 2014-10-26 19:12:19

+0

你應該看到print_r的一些東西......我爲你的第一個和第三個例子得到這個:'Array([0] => SimpleXMLElement Object([0] => Sheila)[1] => SimpleXMLElement Object([0] =>布魯斯))' – rjdown 2014-10-26 19:14:22

+0

有趣的是,我得到了同樣的結果,只有我沒有價值的地方,你得到的名字。 (這裏的額外兩個元素是從多個XML我修剪出計算器描述的):'( [0] => SimpleXMLElement對象 ( ) [1] => SimpleXMLElement對象 ( ) [ 2] => SimpleXMLElement對象 ( ) [3] => SimpleXMLElement對象 ( ) )' – 2014-10-26 19:15:29