Xml xpath:获取没有X祖先的节点
我希望xml文档中的所有节点都不是节点X的后代Xml xpath:获取没有X祖先的节点,xml,xpath,Xml,Xpath,我希望xml文档中的所有节点都不是节点X的后代 (我的实际问题稍微复杂一点,但我现在仍停留在“不是后代”部分)。如果你将“不是后代”翻译为“没有祖先”,你会得到表达式/*[不是(祖先::X)]。这将返回文档中的所有节点,这些节点不是名为“X”的节点的后代。jarnbjo指出了一种直观的方法,即使用/*[not(祖先::X)]。这有一个很大的优点,即无论文档的结构如何,它都可以工作,并且在大多数情况下都应该使用它 但是,如果您有一个非常大的文档,它可能会非常低效。这是一个非常昂贵的查询。它告诉XP
(我的实际问题稍微复杂一点,但我现在仍停留在“不是后代”部分)。如果你将“不是后代”翻译为“没有祖先”,你会得到表达式
/*[不是(祖先::X)]
。这将返回文档中的所有节点,这些节点不是名为“X”的节点的后代。jarnbjo指出了一种直观的方法,即使用/*[not(祖先::X)]
。这有一个很大的优点,即无论文档的结构如何,它都可以工作,并且在大多数情况下都应该使用它
但是,如果您有一个非常大的文档,它可能会非常低效。这是一个非常昂贵的查询。它告诉XPath处理器访问文档中的每个节点,并检查其祖先节点是否存在名为X的元素。虽然XPath处理器可能足够聪明,知道不需要访问X的后代来计算该查询,但可能性不大
如果您有一些关于X元素所在位置的信息,并且非常小心,那么您可以编写一个更高效的查询。例如,如果X是顶级元素的子元素,并且它有很多子元素,则速度会快得多:
/* | /*/* | /*/*[not(name()='X')]//*
它将查找顶级元素、其所有直接子元素以及未命名为X的任何直接子元素的后代。它不会检查任何X的后代
类似地,如果您知道X接近树的底部,则此查询可能更有效:
//*[not(ancestor::*[position() <= 3][X])]
因为它不会检查每个节点的整个祖先轴,只检查最后三个元素。(除非XPath处理器在执行使用position()
(可能是这样)的测试时笨到可以检查轴上的每个节点。)
正如我所说的,大多数时候最简单的版本会是最好的,而大多数时候我会用自己的