web-dev-qa-db-fra.com

Comment vérifier si un élément existe dans le XML en utilisant xpath?

Ci-dessous, la hiérarchie de mes éléments. Comment vérifier (en utilisant xpath) que l’élément AttachedXml est présent sous CreditReport sur Primary - consommateur

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

Utilisez la fonction boolean() XPath

La fonction booléenne convertit son argument en booléen comme suit:

  • un nombre est vrai si et seulement si ce n'est ni zéro positif ni négatif, ni NaN

  • un ensemble de noeuds est vrai si et seulement s'il n'est pas vide

  • une chaîne est vraie si et seulement si sa longueur est différente de zéro

  • un objet d'un type autre que les quatre types de base est converti en un booléen d'une manière qui dépend de ce type

S'il existe un AttachedXml dans le CreditReport de primaire Consommateur , il retournera alors true().

boolean(/mc:Consumers
          /mc:Consumer[@subjectIdentifier='Primary']
            //mc:CreditReport/mc:AttachedXml)
80
Mads Hansen

tiliser:

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

Le documentation Saxon , bien qu'un peu incertain, semble suggérer que l'API JAXP XPath renverra false lors de l'évaluation d'une expression XPath si aucun nœud correspondant n'est trouvé.

Cet article IBM mentionne une valeur de retour de null lorsqu'aucun nœud ne correspond.

Vous devrez peut-être jouer avec les types de retour un peu en fonction de cette API, mais l’idée de base est que vous exécutez simplement un XPath normal et vérifiez si le résultat est un nœud/false/null/etc.

XPathFactory xpathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile("/Consumers/Consumer/DataSources/Credit/CreditReport/AttachedXml");
Object result = expr.evaluate(doc, XPathConstants.NODE);

if ( result == null ) {
    // do something
}
5
Jon Gauthier

Normalement, lorsque vous essayez de sélectionner un nœud en utilisant xpath, votre moteur xpath renvoie la valeur null ou son équivalent si le nœud n'existe pas.

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

Si vous utilisez xsl, répondez à cette question:

xpath trouve si le noeud existe

4

regarde mon exemple

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

maintenant comment vérifier si creative common est existe

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

espérons que cela vous aide

1
Basheer AL-MOMANI