如何访问PHP中的嵌套XML中的值

问题描述:

我正在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字符串的变量。 –

将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

非常感谢你的解释和它的工作.. –