例如,使用此XML...
<test>
<tag0>
<tag1 is="mine">
<uselesstag>
<tag3 is="mine">test</tag3>
</uselesstag>
</tag1>
<tag2 is="mine">test2</tag2>
</tag0>
</test>
。并获取上下文节点的元素(需要上下文节点(
$dom = new DomDocument;
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$context = $xpath->query("//tag1")->item(0);
。如何获得包含任何上下文节点子项的节点列表,并包含属性"is"等于"mine">的自身上下文节点?例如:我只想获取 tag1 和 tag3 元素(tag1 是上下文节点(
$res = $xpath->query('.//*[@is="mine"]',$context);
在这种情况下,节点列表中只有 tag3(子项(可用。
$res = $xpath->query('..//*[@is="mine"]',$context);
在这种情况下,标签 1(上下文节点(、标签 3(子节点(和标签 2(同级(在节点列表中可用。
XPath 有一个轴的概念。默认轴为 child
。像tag1
这样的表达式实际上是child::tag1
的简称。 //tag1
是/descendant::tag1
的简称。这是其他轴,例如 descendant-or-self
.
foreach ($xpath->evaluate('descendant-or-self::*[@is="mine"]', $context) as $node) {
var_dump($node->localName);
}
输出:
string(4) "tag1"
string(4) "tag3"
$res = $xpath->query('.//self::node()[@is="mine"]',$context);
这行得通!