2012-01-10 3 views
6

J'essaye de déterminer l'expression XPath correcte pour retourner la valeur de l'attribut xsi:type sur l'élément Body. J'ai essayé ce qui semble tout sans chance. Sur la base de ce que j'ai lu, cela semble proche, mais ce n'est évidemment pas correct. Des conseils rapides pour que je puisse enfin me reposer?Récupère la valeur de xsi: type avec xpath

//v20:Body/@xsi:type 

Je veux qu'il revienne v20:SmsMessageV1RequestBody

<v20:MessageV1Request> 
    <v20:Header> 
     <v20:Source> 
      <v20:Name>SOURCE_APP</v20:Name> 
      <v20:ReferenceId>1326236916621</v20:ReferenceId> 
      <v20:Principal>2001</v20:Principal> 
     </v20:Source> 
    </v20:Header> 
    <v20:Body xsi:type="v20:SmsMessageV1RequestBody"> 
     <v20:ToAddress>5555551212</v20:ToAddress> 
     <v20:FromAddress>11111</v20:FromAddress> 
     <v20:Message>TEST</v20:Message> 
    </v20:Body> 
</v20:MessageV1Request> 
+4

L'expression Xpath me semble bonne. Utilisez-vous ce XPath dans un XQUERY, un XSLT ou autre chose? La cause la plus probable d'un problème ici est la confusion causée par les préfixes d'espace de noms. Une façon d'éliminer les espaces de noms comme une source de confusion est de réécrire le xpath comme suit: // * [nom-local() eq 'Corps']/@ * [nom-local() eq 'type'] –

+0

Murray a raison , car il y a généralement deux façons de traiter les espaces de noms dans XPath - premièrement: en utilisant les fonctions XPath 'local-name()' et 'namespace-uri()', ensuite: en utilisant les mécanismes appropriés du moteur XPath - par exemple Pour JAXP standard, vous devez utiliser NamespaceContext correctement configuré qui mappe les préfixes aux espaces de noms. –

Répondre

2

Comme il a été souligné dans les commentaires, vous avez deux choix:

  1. Utilisez local-name() pour référencer les nœuds cibles sans tenir compte de namespaces Enregistrer correctement tous les espaces de noms avec le moteur XPath

Voici comment faire ce dernier en Java:

XPath xpath = XPathFactory.newInstance().newXPath(); 
NamespaceContext ctx = new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     if ("v20".equals(prefix)) { 
      return "testNS1"; 
     } else if ("xsi".equals(prefix)) { 
      return "http://www.w3.org/2001/XMLSchema-instance"; 
     } 
     return null; 
    } 
    public String getPrefix(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
    public Iterator getPrefixes(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
}; 
xpath.setNamespaceContext(ctx); 
XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");  
System.out.println(expr.evaluate(doc, XPathConstants.STRING)); 

Notez que je suppose que les déclarations d'espace de noms suivants:

<v20:MessageV1Request xmlns:v20="testNS1" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Vous devez mettre à jour getNamespaceURI utiliser le réel valeurs.

0

Toutes les bonnes réponses/commentaires. Mon problème semble avoir résolu avec une nuit et la construction fraîche dans la matinée. Je vais améliorer avec les commentaires. Merci a tous.

Questions connexes