使用以下部分代码,我通过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"]' );
有效。但是现在我要过滤接收到的数据
我只想从tag =“ 550”中获得code =“ a”的数据,其中code =“ i”的值为“ Funktion”
我只想从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>
答案 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);
}