2012-07-25 14 views
5

Sto cercando di analizzare richiesta SOAP in Java, ma il codice non restituisce alcun nodo ecco il codice nessuno può trovare erroreParse XML con spazi dei nomi in Java utilizzando XPath

 String xml="<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://services.web.post.list.com\"><soapenv:Header><authInfo xsi:type=\"soap:authentication\" xmlns:soap=\"http://list.com/services/SoapRequestProcessor\"><!--You may enter the following 2 items in any order--><username xsi:type=\"xsd:string\">[email protected]</username><password xsi:type=\"xsd:string\">PfasdfRem91</password></authInfo></soapenv:Header></soapenv:Envelope>"; 
    System.out.println(xml); 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse(new InputSource(new StringReader(xml))); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    // XPath Query for showing all nodes value 

    try 
    { 
    XPathExpression expr = xpath.compile("/soapenv:Envelope/soapenv:Header/authInfo/password"); 
    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    System.out.println("Got " + nodes.getLength() + " nodes"); 
// System.out.println(nodes.item(0).getNodeValue()); 
    } 
    catch(Exception E) 
    { 
     System.out.println(E); 
    } 

+0

provare questi: http://stackoverflow.com/questions/5673708/parsing-xml-with-xpath-in-java-get-data-from-xml-file-with-xpath-and-nodelist http://stackoverflow.com/ques/5519766/search-in-xml-file-con-xpath-in-android/5664438 # 5664438 – alibenmessaoud

+0

grazie Proverò questi – Raheel

risposta

8

È necessario impostare un NamespaceContext sul XPath:

Demo

package forum11644994; 

import java.io.StringReader; 
import java.util.Iterator; 

import javax.xml.namespace.NamespaceContext; 
import javax.xml.parsers.*; 
import javax.xml.xpath.*; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     String xml = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://services.web.post.list.com\"><soapenv:Header><authInfo xsi:type=\"soap:authentication\" xmlns:soap=\"http://list.com/services/SoapRequestProcessor\"><!--You may enter the following 2 items in any order--><username xsi:type=\"xsd:string\">[email protected]</username><password xsi:type=\"xsd:string\">PfasdfRem91</password></authInfo></soapenv:Header></soapenv:Envelope>"; 
     System.out.println(xml); 
     DocumentBuilderFactory domFactory = DocumentBuilderFactory 
       .newInstance(); 
     domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 
     Document doc = builder.parse(new InputSource(new StringReader(xml))); 
     XPath xpath = XPathFactory.newInstance().newXPath(); 
     xpath.setNamespaceContext(new NamespaceContext() { 

      @Override 
      public Iterator getPrefixes(String arg0) { 
       return null; 
      } 

      @Override 
      public String getPrefix(String arg0) { 
       return null; 
      } 

      @Override 
      public String getNamespaceURI(String arg0) { 
       if("soapenv".equals(arg0)) { 
        return "http://schemas.xmlsoap.org/soap/envelope/"; 
       } 
       return null; 
      } 
     }); 
     // XPath Query for showing all nodes value 

     try { 
      XPathExpression expr = xpath 
        .compile("/soapenv:Envelope/soapenv:Header/authInfo/password"); 
      Object result = expr.evaluate(doc, XPathConstants.NODESET); 
      NodeList nodes = (NodeList) result; 
      System.out.println("Got " + nodes.getLength() + " nodes"); 
      // System.out.println(nodes.item(0).getNodeValue()); 
     } catch (Exception E) { 
      System.out.println(E); 
     } 

    } 
} 

uscita

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.web.post.list.com"><soapenv:Header><authInfo xsi:type="soap:authentication" xmlns:soap="http://list.com/services/SoapRequestProcessor"><!--You may enter the following 2 items in any order--><username xsi:type="xsd:string">[email protected]</username><password xsi:type="xsd:string">PfasdfRem91</password></authInfo></soapenv:Header></soapenv:Envelope> 
Got 1 nodes 
+1

Grazie, mi ha aiutato – Mufanu

2

Aggiungendo un po 'di più per l'ultima risposta .. Per ottenere il valore del nodo particolare è possibile utilizzare il below-- [System.out.println(nodes.item(0).getTextContent());]

Problemi correlati