Php XPath获取一级子节点
使用DOMXPath::query是否可以只获取一级深度的子节点 例如,如果我有如下文档:Php XPath获取一级子节点,php,xpath,domxpath,Php,Xpath,Domxpath,使用DOMXPath::query是否可以只获取一级深度的子节点 例如,如果我有如下文档: <div> <span> <cite> </cite> </span> <span> <cite> </cite> </span> </div> 如果你使用 /div/* 然后您会得到该元
<div>
<span>
<cite>
</cite>
</span>
<span>
<cite>
</cite>
</span>
</div>
如果你使用
/div/*
然后您会得到该元素中所有直接子元素的列表,但这些子元素包含它们的子元素。我认为你不能把孩子从孩子身上除掉
有一个使用的默认轴,它被称为子轴::
。该轴仅返回当前节点下1级中的元素
*
匹配所有元素,但既不匹配属性也不匹配文本()
您必须指定节点的路径,并注意
//节点
,因为它意味着后代::节点
,并且它返回此树中此名称的所有节点您的问题有点未指定,因此有几种方法可以解释它。如果需要当前元素的所有直接子元素(及其所有子元素),请使用
*/*
举个例子,这给了你
<span>
<cite>
</cite>
</span>
对于您的示例,这将提供上述两个子元素,以及换行/缩进text()
节点
但是,如果只希望子节点,而不希望其子节点(即仅span
元素,但不希望其子元素),则必须使用两个表达式:
*/*
text()
$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