PHP-从xml文件获取特定字段

时间:2018-11-14 09:38:46

标签: php xml xpath

使用以下部分代码,我通过API获取XML数据

$xmlObj = new SimpleXMLElement($result);

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

$sfield = $xmlObj->xpath( '//N:datafield[@tag="550"]/N:subfield[@code="a"]' );

有效。但是现在我要过滤接收到的数据

  1. 我只想从tag =“ 550”中获得code =“ a”的数据,其中code =“ i”的值为“ Funktion”

  2. 我只想从tag =“ 550”中获得code =“ a”的数据,其中code =“ i”的值不是“ Funktion”。

我该如何使用xpath?

带有“功能”的XML示例

<datafield tag="550" ind1=" " ind2=" ">
<subfield code="a">Text</subfield>
<subfield code="4">funk</subfield>
<subfield code="4">http://d-nb.info/standards/elementset/gnd#functionOrRole</subfield>
<subfield code="w">r</subfield>
<subfield code="i">Funktion</subfield>
</datafield>

不带“功能”的XML示例

<datafield tag="550" ind1=" " ind2=" ">
<subfield code="0">(DE-101)041251733</subfield>
<subfield code="0">(DE-588)4125173-8</subfield>
<subfield code="0">http://d-nb.info/gnd/4125173-8</subfield>
<subfield code="a">Grafiker</subfield>
<subfield code="4">beru</subfield>
<subfield code="4">http://d-nb.info/standards/elementset/gnd#professionOrOccupation</subfield>
<subfield code="w">r</subfield>
<subfield code="i">Beruf</subfield>
</datafield>

2 个答案:

答案 0 :(得分:0)

使用此xpath查询

$sfield = $xmlObj->xpath('//N:datafield[@tag="550"][subfield[@code="a"]][subfield[@code="i"][text()="Funktion"]]');

请注意,[text()="Funktion"]过滤器元素具有文本Funktion

答案 1 :(得分:0)

您可以嵌套并组合条件。所以一步一步来:

  • 获取任何datafield元素
    //N:datafield
  • ...具有一个tag属性550
    //N:datafield[@tag="550"]
  • ...并带有子元素subfield
    //N:datafield[@tag="550" and N:subfield]
  • ...具有属性code和值为i
    //N:datafield[@tag="550" and N:subfield[@code="i"]]
  • ...该subfield的文本内容应为Funktion
    //N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]
  • ...并获得subfield的{​​{1}}子级
    datafield
  • ...具有属性//N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]/N:datafield和值为code
    a

对于第二个表达式,您可以仅在该特定表达式上使用//N:datafield[@tag="550" and N:subfield[@code="i"] = "Funktion"]/N:datafield[@code="a"]

  • ...该not()的文本内容应为subfield
    Funktion

Xpath表达式中的空格通常被忽略(在前导//N:datafield[@tag="550" and not(N:subfield[@code="i"] = "Funktion")]之前)。因此,您可以包装和缩进表达,使它们更具可读性。

放在一起:

/

输出:

$xml = <<<'XML'
<foo xmlns="http://www.loc.gov/MARC21/slim">
  <datafield tag="550">
    <subfield code="a">Text</subfield>
    <subfield code="i">Funktion</subfield>
  </datafield>
  <datafield tag="550">
    <subfield code="a">Grafiker</subfield>
    <subfield code="i">Beruf</subfield>
  </datafield>
</foo>
XML;

$element = new SimpleXMLElement($xml);
$element->registerXPathNamespace( 'N', 'http://www.loc.gov/MARC21/slim');

$expression = '//N:datafield[
  @tag="550" and N:subfield[@code="i"] = "Funktion"
]/N:subfield[@code="a"]';

foreach ($element->xpath($expression) as $field) {
    var_dump((string)$field);
}

echo str_repeat('-', 25), "\n";

$expression = '//N:datafield[
  @tag="550" and not(N:subfield[@code="i"] = "Funktion")
]/N:subfield[@code="a"]';

foreach ($element->xpath($expression) as $field) {
    var_dump((string)$field);
}