我是xml的新手。我有以下xml:
<root>
<parent1>
<child1>1</child1>
<child2>2</child2>
</parent1>
<parent1>
<child1>1</child1>
<child2>2</child2>
</parent1>
<parent1>
<child1>1</child1>
<child>
<child1>1</child1>
<child2>2</child2>
</child>
</parent1>
<child2>2</child2>
</root>
我想排除所有<child2>
,无论它们在xml文件中的位置如何,都会产生以下输出:
<root>
<parent1>
<child1>1</child1>
</parent1>
<parent1>
<child1>1</child1>
</parent1>
<parent1>
<child1>1</child1>
<child>
<child1>1</child1>
</child>
</parent1>
</root>
我做了这个xpath,但它没有返回其他所有内容:
/root/parent1/*[not(self::child2)]
什么xpath表达式需要这样做?请帮助。谢谢
答案 0 :(得分:2)
这样的输出不能使用纯XPath生成。
请注意,根据the XPath 1.0 spec,&#34; XPath的主要目的是解决部分XML文档&#34; 。在XML中,root
元素,即开始标记,内容和结束标记被视为一个单元。没有这样的root
元素在XML中不包含child2
元素,XPath可以解决这个问题。 XPath 1.0具有非常有限的功能,可以返回原始XML中不存在的内容。
您需要根据需要重建root
元素,或复制原始XML文档并删除所有child2
元素以获得所需结果。这可以使用XSLT,XQuery或您选择的通用编程语言来完成。
如果您只想获取XML文档中的所有元素,不包括child2
,那么您可以使用此XPath://*[not(self::child2)]
。结果将是单个元素,但不会像您期望的那样构建为一个XML文档,从发布的输出XML判断。