Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP DOM XPath-获取子元素和self(使用带有contextnode的查询)_Php_Xml_Xpath - Fatal编程技术网

PHP DOM XPath-获取子元素和self(使用带有contextnode的查询)

PHP DOM XPath-获取子元素和self(使用带有contextnode的查询),php,xml,xpath,Php,Xml,Xpath,以这个XML为例 <test> <tag0> <tag1 is="mine"> <uselesstag> <tag3 is="mine">test</tag3> </uselesstag> </tag1> <tag2 is="mine">test2</tag2> </tag0>

以这个XML为例

<test>
  <tag0>
    <tag1 is="mine">
        <uselesstag>
            <tag3 is="mine">test</tag3>
        </uselesstag>
    </tag1>
    <tag2 is="mine">test2</tag2>
  </tag0>
</test>
。。。如何获取包含任何contextnode子节点并包含属性“is”等于“mine”的自contextnode的节点列表?例如:我只想获取tag1和tag3元素(tag1是contextnode)

在这种情况下,节点列表上只有tag3(子项)可用

$res = $xpath->query('..//*[@is="mine"]',$context);
$res = $xpath->query('.//self::node()[@is="mine"]',$context);
在本例中,节点列表上有tag1(上下文节点)、tag3(子节点)和tag2(同级节点)

$res = $xpath->query('..//*[@is="mine"]',$context);
$res = $xpath->query('.//self::node()[@is="mine"]',$context);

这管用

XPath有一个轴的概念。默认轴为
子轴
。像
tag1
这样的表达式实际上是
child::tag1
的缩写形式
//tag1
/genderant::tag1
的缩写形式。以下是其他轴,如
后代或self

foreach ($xpath->evaluate('descendant-or-self::*[@is="mine"]', $context) as $node) {
  var_dump($node->localName);
}
输出:

string(4) "tag1"
string(4) "tag3"