web-dev-qa-db-fra.com

xpath trouve si le noeud existe

En utilisant une requête xpath, comment trouver si un nœud (une balise) existe?

Par exemple, si j'avais besoin de m'assurer qu'une page de site Web a la structure de base correcte, telle que/html/body et/html/head/title

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

donc par exemple

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
312
Patrick McDonald

Essayez l'expression suivante: boolean(path-to-node)

69
annesley

Patrick a raison, à la fois dans l'utilisation du xsl:if et dans la syntaxe permettant de vérifier l'existence d'un nœud. Cependant, comme le suggère la réponse de Patrick, il n'y a pas d'équivalent xsl à if-then-else, donc si vous recherchez quelque chose qui ressemble davantage à un if-then-else, vous ferez normalement mieux d'utiliser xsl:choose et xsl:otherwise. Ainsi, l'exemple de syntaxe de Patrick fonctionnera, mais c'est une alternative:

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

Il serait peut-être préférable d’utiliser un choix, de ne pas avoir à taper (ou peut-être de manière erronée) vos expressions plus d’une fois, et vous permet de suivre d’autres comportements différents.

J'utilise très souvent count(/html/body) = 0, car le nombre spécifique de nœuds est plus intéressant que l'ensemble. Par exemple ... lorsqu'il y a de manière inattendue plus d'un nœud qui correspond à votre expression.

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

Je travaille dans Ruby et avec Nokogiri, je vais chercher l'élément et regarde si le résultat est nul.

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?
4
bcolfer

Une variation lors de l'utilisation de xpath dans Java à l'aide de count ():

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