2013-01-23 82 views
0

我有一個XML結構,就像我在下面概述的那樣。我正在嘗試使用xPath來查找結構中的特定元素,但未成功。這是我到目前爲止:使用PHP xPath解析複雜的XML文檔

$ resultset [0] ['bibXML'] - 這是一個粘貼正確的東西在這個變量傳遞。 http://pastebin.com/CwtFG5dj

以下是使用print_r()的$ myNode輸出的鏈接。 http://pastebin.com/TwDaxs42

$myNode = new SimpleXMLElement($resultset[0]['bibXML']); 
$bnum = $myNode->xpath("record/datafield[@tag='035']/subfield[@code='a']"); 


<?xml version="1.0" encoding="UTF-8"?> 
<collection xmlns="http://www.loc.gov/MARC21/slim"> 
<record> 
    <leader>01220nam 2200265 4500</leader> 
    <controlfield tag="001">ocm00000197</controlfield> 
    <datafield tag="035" ind1="" ind2=""> 
     <subfield code="a">.b10000021</subfield> 
     <subfield code="b">a </subfield> 
     <subfield code="c">-</subfield> 
    </datafield> 
    <datafield tag="245" ind1="" ind2=""> 
     <subfield code="a">Some Book Title</subfield> 
     <subfield code="b">a </subfield> 
     <subfield code="c">-</subfield> 
    </datafield> 
</record> 
</collection> 

回答

1

你的元素都在http://www.loc.gov/MARC21/slim命名空間。 Learn about xml namespaces

您的XPath與空名稱空間中的元素匹配,因爲它們沒有前綴。由於您的元素實際上不在空名稱空間中,因此您的XPath不匹配任何內容。

您需要註冊一個名稱空間前綴registerXPathNamespace method,然後使用該前綴來限定您的元素名稱。

這將是你的完整代碼:

$myNode = simplexml_load_string($resultset[0]['bibXML']); 

$myNode->registerXPathNamespace('m21s', 'http://www.loc.gov/MARC21/slim'); 

$results = $myNode->xpath('m21s:record/m21s:datafield[@tag="035"]/m21s:subfield[@code="a"]'); 
$bnum = ($results) ? (string) $results[0] : null; 

var_export($bnum); 
+0

我已經更新了我的代碼對你的建議,我仍然沒有得到響應。 「新的SimpleXMLElement」是將xml加載到的正確函數嗎? – rtd1123

+0

是的,但你也可以說'simplexml_load_string($ xml_string)'。我發佈了完整的代碼,對我來說工作正常。 –

+0

是的,這是問題所在。你的頂層節點是'collection',而不是'record',所有節點都在'http:// www.loc.gov/MARC21/slim'命名空間中。請編輯您的問題以反映真實情況! –