0

Am new in using Xpath parsing in Java for Xmls. But I learnt it and it worked pretty well until this below issue am not sure how to go traverse to next node in this . Please find the below code and Let me know what needs to be corrected .

package test;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class CallTestcall {
    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();

        String responsePath1 = "C:/Verizon/webserviceTestTool/generatedResponse/example.xml";
        Document doc1 = builder.parse(responsePath1);

        String responsePath0 = "C:/Verizon/webserviceTestTool/generatedResponse/response.xml";
        Document doc0 = builder.parse(responsePath0);

        example0(doc0);
        example1(doc1);
    }

    private static void example0(Document example)
            throws XPathExpressionException, TransformerException {
        System.out.println("\n*** First example - namespacelookup hardcoded ***");

        XPath xPath = XPathFactory.newInstance().newXPath();
        xPath.setNamespaceContext(new HardcodedNamespaceResolver());


        String result = xPath.evaluate("s:Envelope/s:Body/ns1:UpdateSessionResponse",
                example);

        // I tried all the Values to traverse further to UpdateSessionResult but am not able to I used the following xpath expressions

        result = xPath.evaluate("s:Envelope/s:Body/ns1:UpdateSessionResponse/a:UpdateSessionResult",
                example);

        result = xPath.evaluate("s:Envelope/s:Body/ns1:UpdateSessionResponse/i:UpdateSessionResult",
                example);

        System.out.println("example0 : "+result);
    }

    private static void example1(Document example)
            throws XPathExpressionException, TransformerException {
        System.out.println("\n*** First example - namespacelookup hardcoded ***");

        XPath xPath = XPathFactory.newInstance().newXPath();
        xPath.setNamespaceContext(new HardcodedNamespaceResolver());

        String result = xPath.evaluate("books:booklist/technical:book/:author",
                example);
        System.out.println("example1 : "+result);
    }

}

Please find the class that implements nameSpaceContext where I have added the prefixes

package test;

import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;

public class HardcodedNamespaceResolver implements NamespaceContext {



/**
     * This method returns the uri for all prefixes needed. Wherever possible it
     * uses XMLConstants.
     * 
     * @param prefix
     * @return uri
     */
    public String getNamespaceURI(String prefix) {
        if (prefix == null) {
            throw new IllegalArgumentException("No prefix provided!");
        } else if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
            return "http://univNaSpResolver/book";
        } else if (prefix.equals("books")) {
            return "http://univNaSpResolver/booklist";
        } else if (prefix.equals("fiction")) {
            return "http://univNaSpResolver/fictionbook";
        } else if (prefix.equals("technical")) {
            return "http://univNaSpResolver/sciencebook";
        } else if (prefix.equals("s")) {
            return "http://schemas.xmlsoap.org/soap/envelope/";
        } else if (prefix.equals("a")) {
            return "http://channelsales.corp.cox.com/vzw/v1/data/";
        } else if (prefix.equals("i")) {
            return "http://www.w3.org/2001/XMLSchema-instance";
        } else if (prefix.equals("ns1")) {
            return "http://channelsales.corp.cox.com/vzw/v1/";
        } 


        else {
            return XMLConstants.NULL_NS_URI;
        }
    }

    public String getPrefix(String namespaceURI) {
        // Not needed in this context.
        return null;
    }

    public Iterator getPrefixes(String namespaceURI) {
        // Not needed in this context.
        return null;
    }

}

Please find my Xml ::::

String XmlString  = "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><UpdateSessionResponse xmlns="http://channelsales.corp.cox.com/vzw/v1/"><UpdateSessionResult xmlns:a="http://channelsales.corp.cox.com/vzw/v1/data/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:ResponseHeader>
<a:SuccessFlag>true</a:SuccessFlag>
<a:ErrorCode i:nil="true"/>
<a:ErrorMessage i:nil="true"/>
<a:Timestamp>2012-12-05T15:28:35.5363903-05:00</a:Timestamp>
</a:ResponseHeader>
<a:SessionId>cd3ce09e-eb33-48e8-b628-ecd406698aee</a:SessionId>
<a:CacheKey i:nil="true"/>

1 Answer 1

3

Try the following. It works for me.

  result = xPath.evaluate("/s:Envelope/s:Body/ns1:UpdateSessionResponse/ns1:UpdateSessionResult",
                  example);

Since you are searching from the root of the document, precede the xpath expression with a forward slash (/)

Also, in the XML fragment below, the string xmlns="http... means you are setting that to be the default namespace. In your namespace resolver you are giving this the prefix ns1. So even though UpdateSessionResult is defining two namespace prefixes a and i, it does not use those prefixes itself (for example <a:UpdateSessionResult...) therefore it belongs to the default namespace (named 'ns1')

<UpdateSessionResponse xmlns="http://channelsales.corp.cox.com/vzw/v1/">
<UpdateSessionResult xmlns:a="http://channelsales.corp.cox.com/vzw/v1/data/"  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

That's why you need to use ns1:UpdateSessionResult instead of either a:UpdateSessionResult or i:UpdateSessionResult

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks a lot dude you made my day . I tried a lot yesterday to solve but I couldn proceed further actually though updateSessionResult has two namespaces but it doesnt use those prefix itself so it take the default one . What a dumb am I :( .. Anyways Thanks a lot :):)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.