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

时间:2017-10-11 07:44:40

标签: php html xml web fetch

我在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>

我怎么能得到“半女朋友”或“新德里”的价值观?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

将XPath与您拥有的文档一起使用,您可以使用限制器组合提取数据。如果你知道你需要datafield元素中的数据 - 标签值是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'。