2017-10-11 30 views
0

我正在PHP中使用以下XML字符串,我想從中訪問特定值。如何訪問PHP中的嵌套XML中的值

例如:我如何提取標題的值?

下面是我的XML內容:

<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" xmlns="http://www.loc.gov/MARC21/slim"> 
 
    <leader>01118cam a22003497i 4500</leader> 
 
    <controlfield tag="001">18475363</controlfield> 
 
    <controlfield tag="005">20151007123810.0</controlfield> 
 
    <controlfield tag="008">141017s2014 ii   000 f eng d</controlfield> 
 
    
 
    <datafield tag="245" ind1="1" ind2="0"> 
 
    <subfield code="a">Half girlfriend /</subfield> 
 
    <subfield code="c">Chetan Bhagat.</subfield> 
 
    </datafield> 
 
    <datafield tag="264" ind1=" " ind2="1"> 
 
    <subfield code="a">New Delhi :</subfield> 
 
    <subfield code="b">Rupa,</subfield> 
 
    <subfield code="c">2014.</subfield> 
 
    </datafield> 
 
    </record>

我怎麼得到的值 「半女友」 或 「新德里」?

任何幫助表示讚賞。

+0

你可以顯示一些你已經嘗試過的代碼嗎? –

+0

到目前爲止。我已經嘗試將XML轉換爲PHP數組,然後從它手動訪問該記錄..'$ value = simplexml_load_string($ final_marc); $ json = json_encode($ value); $ configData = json_decode($ json,true); print_r($ configData);'但到目前爲止沒有運氣,我認爲這是錯誤的方法。 –

+0

'final_marc'是保存我的xml字符串的變量。 –

回答

0

將XPath與您擁有的文檔結合使用,您可以使用限制器組合提取數據。如果你知道你將需要其中的數據字段元數據 - 標籤值是245,和子代碼爲「A」,那麼你可以這樣做......

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$final_marc = <<< XML 
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" xmlns="http://www.loc.gov/MARC21/slim"> 
    <leader>01118cam a22003497i 4500</leader> 
    <controlfield tag="001">18475363</controlfield> 
    <controlfield tag="005">20151007123810.0</controlfield> 
    <controlfield tag="008">141017s2014 ii   000 f eng d</controlfield> 

    <datafield tag="245" ind1="1" ind2="0"> 
    <subfield code="a">Half girlfriend /</subfield> 
    <subfield code="c">Chetan Bhagat.</subfield> 
    </datafield> 
    <datafield tag="264" ind1=" " ind2="1"> 
    <subfield code="a">New Delhi :</subfield> 
    <subfield code="b">Rupa,</subfield> 
    <subfield code="c">2014.</subfield> 
    </datafield> 
    </record> 
XML; 
$value=simplexml_load_string($final_marc); 
$value->registerXPathNamespace("d","http://www.loc.gov/MARC21/slim"); 
echo "245-a".$value->xpath("//d:datafield[@tag='245']/d:subfield[@code='a']/text()")[0].PHP_EOL; 
echo "264-a".$value->xpath("//d:datafield[@tag='264']/d:subfield[@code='a']/text()")[0].PHP_EOL; 

當你有一個默認命名空間,這是註冊的文件,在這種情況下,我已經定義'd'作爲前綴方便。然後在XPath中,將d放在元素名稱的前面。 @tag位表示屬性值= 264(例如)或代碼屬性爲'a'。

+0

你能解釋我這一行'$ value-> registerXPathNamespace(「d」,「http://www.loc.gov/MARC21/slim」);' –

+0

當使用XPath時,你需要定義任何命名空間,你正在查詢中使用。由於這個文檔有一個默認的命名空間(在普通元素中沒有前綴),我使用'd'作爲方便的值。在隨後的XPath表達式中,將'd:'放在元素名稱前面,以表示您需要特定名稱空間中的元素。 –

+0

非常感謝你的解釋和它的工作.. –