如何访问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>
我怎么得到的值 “半女友” 或 “新德里”?
任何帮助表示赞赏。
将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'。
你能解释我这一行'$ value-> registerXPathNamespace(“d”,“http://www.loc.gov/MARC21/slim”);' –
当使用XPath时,你需要定义任何命名空间,你正在查询中使用。由于这个文档有一个默认的命名空间(在普通元素中没有前缀),我使用'd'作为方便的值。在随后的XPath表达式中,将'd:'放在元素名称前面,以表示您需要特定名称空间中的元素。 –
非常感谢你的解释和它的工作.. –
你可以显示一些你已经尝试过的代码吗? –
到目前为止。我已经尝试将XML转换为PHP数组,然后从它手动访问该记录..'$ value = simplexml_load_string($ final_marc); $ json = json_encode($ value); $ configData = json_decode($ json,true); print_r($ configData);'但到目前为止没有运气,我认为这是错误的方法。 –
'final_marc'是保存我的xml字符串的变量。 –