Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 XPath获取一级子节点_Php_Xpath_Domxpath - Fatal编程技术网

Php XPath获取一级子节点

Php XPath获取一级子节点,php,xpath,domxpath,Php,Xpath,Domxpath,使用DOMXPath::query是否可以只获取一级深度的子节点 例如,如果我有如下文档: <div> <span> <cite> </cite> </span> <span> <cite> </cite> </span> </div> 如果你使用 /div/* 然后您会得到该元

使用DOMXPath::query是否可以只获取一级深度的子节点

例如,如果我有如下文档:

<div>
    <span>
        <cite>
        </cite>
    </span>
    <span>
        <cite>
        </cite>
    </span>
</div>
如果你使用

/div/*
然后您会得到该元素中所有直接子元素的列表,但这些子元素包含它们的子元素。我认为你不能把孩子从孩子身上除掉

有一个使用的默认轴,它被称为
子轴::
。该轴仅返回当前节点下1级中的元素

*
匹配所有元素,但既不匹配属性也不匹配文本()


您必须指定节点的路径,并注意
//节点
,因为它意味着
后代::节点
,并且它返回此树中此名称的所有节点

您的问题有点未指定,因此有几种方法可以解释它。如果需要当前元素的所有直接子元素(及其所有子元素),请使用

*/*
举个例子,这给了你

<span>
    <cite>
    </cite>
</span>
对于您的示例,这将提供上述两个子元素,以及换行/缩进
text()
节点

但是,如果只希望子节点,而不希望其子节点(即仅
span
元素,但不希望其子元素),则必须使用两个表达式:

  • 通过
    */*
  • 处理这些子元素,并通过
    text()
  • 我的PHP有点生疏,但它应该是这样工作的:

    $doc = new DOMDocument;
    // set up $doc
    $xpath = new DOMXPath($doc);
    
    // perform step #1
    $childElements = $xpath->query('*/*');
    
    $directChildren = array();
    foreach ($childElements as $child) {
      // perform step #2
      $textChildren = $xpath->query('text()', $child);
      foreach ($textChildren as $text) {
        $directChildren[] = $text;
      }
    }
    // now, $directChildren contains all text nodes
    

    谢谢,最后一个是我要找的。只有直接子节点,没有子节点。你能详细介绍一下这个例子吗?我对XPath有>非常<新的了解,它还没有完全点击。感谢child::axis的建议。这应该是公认的答案。
    <span>
        <cite>
        </cite>
    </span>
    
    */node()
    
    $doc = new DOMDocument;
    // set up $doc
    $xpath = new DOMXPath($doc);
    
    // perform step #1
    $childElements = $xpath->query('*/*');
    
    $directChildren = array();
    foreach ($childElements as $child) {
      // perform step #2
      $textChildren = $xpath->query('text()', $child);
      foreach ($textChildren as $text) {
        $directChildren[] = $text;
      }
    }
    // now, $directChildren contains all text nodes