如何使用xpath检查xml中是否存在元素?

时间:2011-04-16 22:12:32

标签: xml xpath

下面是我的元素层次结构。如何检查(使用xpath) AttachedXml 元素出现在主要 消费者 CreditReport

<Consumers xmlns="http://xml.mycompany.com/XMLSchema">
       <Consumer subjectIdentifier="Primary">
          <DataSources>
               <Credit>
                   <CreditReport>
                      <AttachedXml><![CDATA[ blah blah]]>

6 个答案:

答案 0 :(得分:78)

使用boolean() XPath function

  

布尔函数转换它的   布尔值的参数如下:

     
      
  • 当且仅当,数字为真   它既不是正面的,也不是负面的   零也不是NaN

  •   
  • 当且仅当时,节点集为真   它是非空的

  •   
  • 当且仅当,字符串为真   它的长度是非零的

  •   
  • 除了以外的类型的对象   四种基本类型转换为a   boolean的方式依赖于   那种类型

  •   

如果主要 消费者 CreditReport 中有 AttachedXml ,则会返回{{1 }}

true()

答案 1 :(得分:6)

使用

boolean(/*/*[@subjectIdentifier="Primary"]/*/*/*/*
                           [name()='AttachedXml' 
                          and 
                            namespace-uri()='http://xml.mycompany.com/XMLSchema'
                           ]
       )

答案 2 :(得分:5)

Saxon documentation虽然有点不清楚,但似乎暗示如果没有找到匹配的节点,则在评估XPath表达式时JAXP XPath API将返回false

This IBM article在没有节点匹配时提到null的返回值。

您可能需要根据此API稍微使用返回类型,但基本思路是您只运行一个普通的XPath并检查结果是否为节点/ false / {{1 / etc。

null

答案 3 :(得分:4)

通常,当您尝试使用xpath选择节点时,如果节点不存在,则xpath-engine将返回null或等效节点。

xpath: "/Consumers/Consumer/DataSources/Credit/CreditReport/AttachedXml"

如果您使用xsl,请查看此问题以获得答案:

xpath find if node exists

答案 4 :(得分:1)

看看我的例子

<tocheading language="EN"> 
     <subj-group> 
         <subject>Editors Choice</subject> 
         <subject>creative common</subject> 
     </subj-group> 
</tocheading> 

现在如何检查creative common是否存在

tocheading/subj-group/subject/text() = 'creative common'

希望这能帮到你

答案 5 :(得分:-1)

如果boolean()不可用(我正在使用的工具没有),实现它的一种方法是:

//SELECT[@id='xpto']/OPTION[not(not(@selected))]

在这种情况下,在/ OPTION中,其中一个选项是选定的选项。 “selected”没有值...它只是存在,而另一个OPTION没有“selected”。这实现了目标。