2014-11-16 127 views
0

我試圖讓用戶檢索特定的XML節點並打印信息。我的XML數據如下:使用PHP檢索XML元素數據

<people> 
    <person id="1"> 
    <forename>Jim</forename> 
    <surname>Morrison</surname> 
    </person> 
    <person id="2"> 
    <forename>James</forename> 
    <surname>Frank</surname> 
    </person> 
    </people> 

我希望能夠搜索到我的XML文檔使用一個名稱或ID,比如我希望能夠說,「檢查詹姆斯存在,如果詹姆斯不,打印出他的信息,否則打印出錯誤信息'。 我已經想通,我首先需要包括與文件:

$xml=simplexml_load_file("credentials.xml") or die("Error: Cannot create object"); 

從這時開始我不確定如何進行,我看的SimpleXML和XPath,但我不能確定如何用這些來達到這個目的。謝謝如果你能幫助

回答

1

讓我們xpath()

$xml = simplexml_load_string($x); // assume XML in $x 
$result = $xml->xpath("/people/person[forename = 'James']")[0]; 

上面的xpath表達式將選擇任何<person>具有「詹姆斯」作爲<forename>並將其存儲爲在$result陣列。

[0]在第2行的末尾,我們只選擇該數組中的第一個條目並將其存儲在$result中。這需要PHP> = 5.4。

我們也可以這樣寫,以獲得相同的結果:

$result = $xml->xpath("/people/person[forename = 'James']"); 
$result = $result[0]; 

如果XML有超過1個詹姆斯,我們只會得到第一。 要獲得所有的詹姆斯,請按照上面的第1行進行操作。

echo $result->forename . ' ' . $result->surname .' has id ' . $result['id'] . "."; 

如果$result包含幾個Jameses,做到:

foreach ($result as $person) { 
    echo $person->forename . ' ' . $person->surname .' has id ' . $person['id'] . "." . PHP_EOL; 
} 

看到它的工作:https://eval.in/222195

+0

這是很好的建議,我使用DOM實現了對我的問題的工作解決方案,但我認爲這比我的結果更好,所以我會嘗試使用這個,非常感謝。 –

+0

@LucasHolmes很高興我能幫到你 – michi

0

想出如何解決大多與此問題:

$xml=simplexml_load_file("credentials.xml") or die("Error: Cannot create object"); 
    foreach($xml->children() as $people){ 
    if ($people->forename == "james"){echo $people->forename;} 
    } 

這可能是低效的,所以如果其他人有更好的辦法請不要指定:)

+0

你可以爲

然後,我們輸出的<person>我們的XPath表達式選擇示例使用正則表達式編寫自己的解釋器(PCRE庫,應該默認啓用它)。 http://php.net/manual/en/ref.pcre.php你也可以僅僅通過遍歷每個字符和檢測模式來解析整個文本。 –

1

你應該使用manual

simplexml_load_file返回一個SimpleXMLElement對象。

從這裏你可以使用對象children方法來獲得你想要的孩子,這也將是更多的SimpleXMLElement對象。假設你首先想讓孩子們叫人,然後想要人。當獲得人物對象時,可以通過方法attributes獲取屬性的值以獲取名稱和值等。由於SimpleXMLElement實現了Traversable,因此可以使用foreach循環來循環訪問返回的列表/數組。