2009-04-20 595 views
182

使用xpath查询如何查找节点(标签)是否存在?xpath查找是否存在节点

例如,如果我需要确保网站页面有一个像/ HTML /身体和/ HTML /头/标题

+0

也许最好是使用带有强制性元素指示的XML模式?因此请检查文档是否使用它。 – abatishchev 2009-04-20 11:19:48

回答

289
<xsl:if test="xpath-expression">...</xsl:if> 

因此,例如正确的基本结构

<xsl:if test="/html/body">body node exists</xsl:if> 
<xsl:if test="not(/html/body)">body node missing</xsl:if> 
+39

因为这个问题根本没有指定使用XSLT,所以感到惊讶。 – tjmoore 2011-07-21 19:31:21

+0

这真棒,但如果我想检查它是否存在或是空的呢? – SearchForKnowledge 2015-05-14 19:06:42

+3

@SearchForKnowledge,你可能应该问这是一个新的问题,但作为一个快速指南:`html/body和not(html/body/node())`(即只测试它是否存在,而不是包含任何子节点或文本节点)。 – Abel 2015-09-06 11:30:32

2

一使用count()在Java中使用xpath时的变化:

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc)); 
if(numberofbodies==0) { 
    // body node missing 
} 
+0

这工作超级大! – 2016-05-03 02:10:42

64

请尝试以下表达式:boolean(path-to-node)

+3

这正是我在使用lxml的Python中使用XPath时所需要的。 – 2011-03-18 12:04:03

11

可能会更好地使用选择,不必输入(或可能错误键入)多次表达式,并允许您遵循其他不同的行为。

我经常使用count(/html/body) = 0,因为具体的节点数量比集合更有趣。例如...当意外地有超过1个节点符合你的表达。

<xsl:choose> 
    <xsl:when test="/html/body"> 
     <!-- Found the node(s) --> 
    </xsl:when> 
    <!-- more xsl:when here, if needed --> 
    <xsl:otherwise> 
     <!-- No node exists --> 
    </xsl:otherwise> 
</xsl:choose> 
38
帕特里克

是正确的,无论是在使用xsl:if的,并在语法检查的节点的存在。然而,正如帕特里克的回答所暗示的那样,没有xsl等同于if-then-else,所以如果你正在寻找更像if-then-else的东西,你通常会更好地使用xsl:choosexsl:otherwise。所以,帕特里克例如语法都可以工作,但是这是一种替代方案:

<xsl:choose> 
<xsl:when test="/html/body">body node exists</xsl:when> 
<xsl:otherwise>body node missing</xsl:otherwise> 
</xsl:choose> 
3

我在Ruby的工作,利用引入nokogiri我取的元素,看看如果结果是零。

require 'nokogiri' 

url = "http://somthing.com/resource" 

resp = Nokogiri::XML(open(url)) 

first_name = resp.xpath("/movies/actors/actor[1]/first-name") 

puts "first-name not found" if first_name.nil?