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
Xml xpath:获取没有X祖先的节点_Xml_Xpath - Fatal编程技术网

Xml xpath:获取没有X祖先的节点

Xml xpath:获取没有X祖先的节点,xml,xpath,Xml,Xpath,我希望xml文档中的所有节点都不是节点X的后代 (我的实际问题稍微复杂一点,但我现在仍停留在“不是后代”部分)。如果你将“不是后代”翻译为“没有祖先”,你会得到表达式/*[不是(祖先::X)]。这将返回文档中的所有节点,这些节点不是名为“X”的节点的后代。jarnbjo指出了一种直观的方法,即使用/*[not(祖先::X)]。这有一个很大的优点,即无论文档的结构如何,它都可以工作,并且在大多数情况下都应该使用它 但是,如果您有一个非常大的文档,它可能会非常低效。这是一个非常昂贵的查询。它告诉XP

我希望xml文档中的所有节点都不是节点X的后代


(我的实际问题稍微复杂一点,但我现在仍停留在“不是后代”部分)。

如果你将“不是后代”翻译为“没有祖先”,你会得到表达式
/*[不是(祖先::X)]
。这将返回文档中的所有节点,这些节点不是名为“X”的节点的后代。

jarnbjo指出了一种直观的方法,即使用
/*[not(祖先::X)]
。这有一个很大的优点,即无论文档的结构如何,它都可以工作,并且在大多数情况下都应该使用它

但是,如果您有一个非常大的文档,它可能会非常低效。这是一个非常昂贵的查询。它告诉XPath处理器访问文档中的每个节点,并检查其祖先节点是否存在名为X的元素。虽然XPath处理器可能足够聪明,知道不需要访问X的后代来计算该查询,但可能性不大

如果您有一些关于X元素所在位置的信息,并且非常小心,那么您可以编写一个更高效的查询。例如,如果X是顶级元素的子元素,并且它有很多子元素,则速度会快得多:

/* | /*/* | /*/*[not(name()='X')]//*
它将查找顶级元素、其所有直接子元素以及未命名为X的任何直接子元素的后代。它不会检查任何X的后代

类似地,如果您知道X接近树的底部,则此查询可能更有效:

//*[not(ancestor::*[position() <= 3][X])]
因为它不会检查每个节点的整个祖先轴,只检查最后三个元素。(除非XPath处理器在执行使用
position()
(可能是这样)的测试时笨到可以检查轴上的每个节点。)

正如我所说的,大多数时候最简单的版本会是最好的,而大多数时候我会用自己的