2015-10-30 59 views
1

這裏是我的問題:用PHP(但非常具體的約束)獲取從XML數據

我有這個百通一個XML文件:

<doc_xml> 
    <ad> 
    <ref>123456</ref> 
    <date>20150101</date> 
    <title>My first child title</title> 
    </ad> 
    <ad> 
    <ref>897510</ref> 
    <date>20170211</date> 
    <title>My second child title</title> 
    </ad> 
</doc_xml> 

,我想要做的就是讓所有的<廣告>但是隻有當<裁判的孩子中的一個數據>值(對於爲例)= 123456,所以在這種情況下,只得到這與我的請求數據的列表:

$ref = 123456; 
$date = 123456; 
$title = 'My first child title'; 

目前,我有日在PHP代碼:

xml=simplexml_load_file("file.xml") or die("Error: Cannot create object"); 
$ref = '123456'; 
$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')] 
"); 
print_r($data); 

,讓我得到這個數組:

Array ([0] => SimpleXMLElement Object ([0] => 123456)) 

但我無法找到如何讓其他孩子的值(在同一水平上,<date><title>)。

希望我很清楚。任何幫助表示讚賞,謝謝!

回答

2

Xpath中的條件可以在任何位置,更復雜。

看起來不對 - 例如123456包含234。我建議使用normalize-space()和等於。

你有兩種可能的解決方案:

與特定ref

返回讀取的ad元素ad元素:
/doc_xml/ad

...有ref子元素:
/doc_xml/ad[ref]

...這等於特定文本:
/doc_xml/ad[normalize-space(ref) = '123456']

使用XPath與裁判節點作爲上下文

回報所有ad元素:
/doc_xml/ad/ref[normalize-space(.) = '123456']

隨着發現ref元素作爲背景下,取兄弟姐妹title

../title

或:

parent::*/title

使用SimpleXML中的一個節點作爲上下文意味着你調用節點上的方法xpath()。在DOM中,您將它作爲DOMXpath::evaluate()的第二個參數提供。

1
$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')]/parent::*"); 
print_r($data); 

發現孩子和移動xpath到孩子的parent。所以,你會得到數據的排列如下

Array ([0] => SimpleXMLElement Object ([ref] => 123456 [date] => 20150101 [title] => My first child title)) 
+0

讓我們簡化和去了''節點直接:'$數據= $ XML的>的XPath(「/ DOC_XML /廣告[參考= '123456'] 「)[0];'然後執行'echo $ data-> title;'和'echo $ data-> date;',看它是否工作:https://eval.in/460761 – michi