XPath获取一级子节点

问题描述:

使用DOMXPath :: query可以获得childNodes的一级深度吗?XPath获取一级子节点

例如,如果我有一个像一个文件:

<div> 
    <span> 
     <cite> 
     </cite> 
    </span> 
    <span> 
     <cite> 
     </cite> 
    </span> 
</div> 

我希望节点列表包含只是跨度,而不是引用。

还应该提及它不总是相同的元素(divs,span等)。我需要它来处理任何类型的元素。

这是我尝试过,它似乎并没有工作:

//*[not(ancestor::div)] 

如果使用

/div/* 

然后你在这个元素的所有直接孩子,但这些孩子的名单包含他们的孩子。我认为你不能删除孩子的孩子

有使用默认轴,它被称为child::。此轴返回仅在1级元素在当前节点下

*比赛的所有元素,但既没有属性也没有文本()

您必须指定路径的节点,并小心//node因为这意味着descendant::node它返回此树中此名称的所有节点

+0

感谢孩子::轴建议。这应该是被接受的答案。 – Eternal21 2015-01-07 18:23:39

您的问题有点不足,因此有多种解释方法。如果你想在当前元素(及其所有子元素)的所有直接子元素,然后用

*/* 

对于你的榜样,这给你

<span> 
    <cite> 
    </cite> 
</span> 

<span> 
    <cite> 
    </cite> 
</span> 

如果你想要所有的小孩节点,然后用node()而不是*

*/node() 

对于您的示例,这会为您提供上述两个子元素以及换行符/缩进text()节点。

但是,如果您想要只有子节点,而不是他们的孩子(即,只有span元素,但没有他们的子元素),则必须使用两个表达式:

  1. 通过*/*
  2. 过程中选择的直接子元素的子元素,并只选择文本节点,而不是孙子元素通过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 
+0

谢谢恩,最后一个是我正在寻找的。只是直接的孩子节点,没有孙子。你可以扩展更多的例子吗?我对XPath>非常新,并且还没有完全点击。 – Greg 2010-01-01 16:44:08