使用DOMDocument,是否可以根据附加参数过滤getElementsByTagName的输出


With DOMDocument, is it possible to filter the output of getElementsByTagName based on an additional parameter?

以这个xml为例:

<xml>
<siblings>
    <brother>Derek</brother>
    <sister>Elaine</sister> 
    <sister>Flora</sister>
</siblings>
<siblings>
    <brother>Gary</brother>
    <sister>Hannah</sister> 
</siblings> 
</xml>

如果我使用下面的代码:

$xmlDoc=new DOMDocument();
$xmlDoc->load("Family.xml");
$siblings = $xmlDoc->getElementsByTagName('Siblings');
$sister = $xmlDoc->getElementsByTagName('Sister');  

这通常会返回标签"Sister"的所有实例,在本例中是"Elaine"、"Flora"answers"Hannah"。是否有可能对其进行更改,以便您可以根据其他节点的名称过滤标记名?例如,使用名称"Derek"将输出仅更改为"Elaine"answers"Flora"。

Xpath表达式允许您使用条件从DOM中获取节点。

$xml = <<<'XML'
<xml>
<siblings>
    <brother>Derek</brother>
    <sister>Elaine</sister> 
    <sister>Flora</sister>
</siblings>
<siblings>
    <brother>Gary</brother>
    <sister>Hannah</sister> 
</siblings> 
</xml>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = '/xml/siblings[brother = "Derek"]/*[not(self::brother = "Derek")]';
foreach ($xpath->evaluate($expression) as $sibling) {
  echo $sibling->textContent, "'n";
}
输出:

Elaine
Flora

Xpath表达式

  • 获取siblings元素…
    /xml/siblings
  • …如果它们有一个值为Derek的子元素brother
    /xml/siblings[brother = "Derek"]
  • …并获取它们的子元素…
    /xml/siblings[brother = "Derek"]/*
  • …如果它们不是brother元素节点,值为Derek
    /xml/siblings[brother = "Derek"]/*[not(self::brother = "Derek")]