以这个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")]