2012-01-10 6 views
6

Sto cercando di determinare l'espressione XPath corretta per restituire il valore dell'attributo xsi:type sull'elemento Body. Ho provato quello che sembra tutto senza fortuna. Sulla base di ciò che ho letto, questo sembrerebbe vicino ma ovviamente non è corretto. Qualche guida rapida in modo da poter finalmente riposare?Ottieni il valore di xsi: tipo con xpath

//v20:Body/@xsi:type 

voglio per tornare 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'espressione Xpath mi sembra buona. Stai usando questo XPath in XQUERY, XSLT o qualcos'altro? La causa più probabile di un problema qui è la confusione causata dai prefissi dei namespace. Un modo per eliminare gli spazi dei nomi come fonte di confusione è riscrivere il xpath come segue: // * [nome-locale() eq 'Corpo']/@ * [nome-locale() eq 'tipo'] –

+0

Murray ha ragione , perché ci sono generalmente due modi per gestire gli spazi dei nomi in XPath: in primo luogo: usando le funzioni XPath di 'local-name()' e 'namespace-uri()', in secondo luogo: usando i meccanismi appropriati del motore XPath - es. per JAXP standard è necessario utilizzare NamespaceContext configurato correttamente che esegue la mappatura dei prefissi ai namespace. –

risposta

2

Come ricordato nei commenti, si hanno due scelte:

  1. Usa local-name() per fare riferimento ai nodi di destinazione, senza riguardo per i namespace
  2. Registrare correttamente tutti i namespace con il motore XPath

Ecco come fare il secondo in 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)); 

Nota che sto assumendo le seguenti dichiarazioni di namespace:

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

Avrai bisogno di aggiornare getNamespaceURI di utilizzare l'attuale valori.

0

Tutte ottime risposte/feedback. Il mio vero problema sembra essersi risolto con una notte di distanza e una nuova build al mattino. Migliorerò con il feedback. Ringrazia tutti.