【问题标题】:PHP DOM XPath - Get child elements AND self (using query with contextnode)PHP DOM XPath - 获取子元素和自我(使用上下文节点查询)
【发布时间】:2016-02-15 15:05:37
【问题描述】:

以这个 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是contextnode)

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

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

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

在这种情况下,tag1(contextnode),tag3(child)和tag2(sibling)在节点列表中可用。

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:
    $res = $xpath->query('.//self::node()[@is="mine"]',$context);
    

    这行得通!

    【讨论】:

      【解决方案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"
      

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 2011-06-04
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 2012-03-01
        相关资源
        最近更新 更多