如何通过使用XPath排除特定的xml元素来选择所有xml元素

时间:2016-03-09 05:49:48

标签: xml xpath

我是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表达式需要这样做?请帮助。谢谢

1 个答案:

答案 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判断。