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
它返回此树中此名称的所有节点
您的问题有点不足,因此有多种解释方法。如果你想在当前元素(及其所有子元素)的所有直接子元素,然后用
*/*
对于你的榜样,这给你
<span>
<cite>
</cite>
</span>
和
<span>
<cite>
</cite>
</span>
如果你想要所有的小孩节点,然后用node()
而不是*
:
*/node()
对于您的示例,这会为您提供上述两个子元素以及换行符/缩进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>非常新,并且还没有完全点击。 – Greg 2010-01-01 16:44:08
感谢孩子::轴建议。这应该是被接受的答案。 – Eternal21 2015-01-07 18:23:39