xpath查找节点是否存在


201

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

例如,如果我需要确保网站页面具有正确的基本结构,例如/ html / body和/ html / head / title


也许将XML Schema与强制性元素指示一起使用会更好?因此,请检查文档是否使用它。
abatishchev

Answers:


321
<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>

41
鉴于该问题根本没有指定使用XSLT,因此对如此高的评分感到惊讶。
tjmoore

这太棒了,但是如果我想检查它是否存在或为空怎么办?
SearchForKnowledge

3
@SearchForKnowledge,您可能应该在SO上提出一个新问题,但可以作为快速指南:(html/body and not(html/body/node())即,仅测试它是否存在并且不包含任何子节点或文本节点)。
亚伯2015年

71

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


3
这正是在带有lxml的Python中使用XPath时所需要的。
伊恩·塞缪尔·麦克莱恩

1
施工时规则条件和规则操作中的InfoPath 2010中该工作一种享受
Merenzo

3
从某种意义上说,这实际上是XPath查询,这与大多数其他答案不同,这是正确的答案。
Paul Etherton

48

Patrick在使用xsl:if和以及检查节点是否存在的语法方面都是正确的。但是,正如Patrick的回答所暗示的,没有xsl等效于if-then-else,因此,如果您正在寻找更类似于if-then-else的东西,通常最好使用xsl:chooseand xsl:otherwise。因此,帕特里克(Patrick)的示例语法将起作用,但这是另一种选择:

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

请注意+1 if-then-else,那又如何if-else if-else呢?在davenpcj的答案中,我test="somexpath"何时可以放置在第二个位置if-else if-else
AabinGunz 2011年

3
@Abhishek是的,在其他条件下并具有多分支语句时,您可以放置​​更多xsl:。可以将其更像是SELECT而不是if-then-else,将xsl:otherwise作为默认值:。
davenpcj 2011年

这太棒了,但是如果我想检查它是否存在或为空怎么办?
SearchForKnowledge

13

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

我经常使用count(/html/body) = 0,因为特定数量的节点比集合更有趣。例如...当意外地有多个节点与您的表达式匹配时。

<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>

如上面的代码所示,可以添加更多xsl:when子句以更改行为并以不同方式处理多个条件。
davenpcj 2011年

count(/html/body) = 0 天才 !:DI使用它/html[count(/body)=0]/someNode来选择someNode何时/body(或什么时候)丢失
Stefan Rogin

1
@clickstefan,/html[count(/body)=0]将永远不会选择任何内容,XML中不能有两个根节点。也许您的意思/html[count(body)=0]是与/html[not(body)]或相同/html[not(exists(body))]
亚伯

@Abel是的,/ html [count(// body)= 0]或您怎么说,可耻但我没有给出正确的例子
Stefan Rogin

4

我在Ruby中工作,并使用Nokogiri获取了元素并查看结果是否为nil。

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?

3

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

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.