Reading an XML file from within an XML tag from Java

Hi I have an XML SOAP response which starts with the following XML:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetAppXmlResponse xmlns="http://***.***.gov.uk/***">
<GetAppXmlResult>
<Connector timestamp="9/26/2008 10:46:26 AM" xmlns="">
<code>0</code>
<message>Success</message>
<getappxml>
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Proposal>
<SchemaVersion>1.1</SchemaVersion>
<ApplicationHeader>Sample Header</ApplicationHeader>
 
//further nodes and elements
 
</Proposal>
]]>
</getappxml>
</Connector>
</GetAppXmlResult>
</GetAppXmlResponse>
</soap:Body>
</soap:Envelope>

I need to access the proposal node to get the RefNum although I'm not sure how to do this is Java.
moorcroftladAsked:
Who is Participating?
 
manuel_mConnect With a Mentor Commented:
The xmlText is the String value from the getappxml element/node.
I think you would get the value with your method

String xmlText = getPathValue(doc,"//soap:Envelope/soap:Body/GetAppXmlResponse/GetAppXmlResult/Connector/getappxml/scotapp:Proposal/");

The steps are:
1. Get the value of the getappxml node.
2. Create a Document object of the string value extracted from step 1.
3. get the value from RefNum from the created document in step 2.
// get the xml string from the getappxml node
String xmlText = getPathValue(doc,"//soap:Envelope/soap:Body/GetAppXmlResponse/GetAppXmlResult/Connector/getappxml");
Document getAppDocument = null;
try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// create a new document object from the string.
            getAppDocument = builder.parse(new InputSource(new StringReader(xmlText)));
        } catch (SAXException e) {
            throw new UtilRuntimeException("", e);
        } catch (IOException e) {
            throw new UtilRuntimeException("", e);
        } catch (ParserConfigurationException e) {
            throw new UtilRuntimeException("", e);
        }
 
// get the RefNum value from the newly created document.
if(getPathValue(getAppDocument,"//Proposal/ApplicationHeader/RefNum").length()>0) {
                  strVersion="0.8";
            }

Open in new window

0
 
manuel_mCommented:
What kind of object do you have when you get the SOAP response?

A SOAPDocument object or something else?

manuel
0
 
manuel_mCommented:
If you have an org.w3c.dom.Document or Node you could use Xpath to get your value.
javax.xml.xpath.XPathXPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
 
// node is your xml org.w3c.dom.Document object or org.w3c.dom.Node 
try {
String value = (String) xpath.compile("//Proposal/RefNum").evaluate(node, XPathConstants.STRING);
} catch (javax.xml.xpath.XPathExpressionException e) {
e.printStackTrace();
}

Open in new window

0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
moorcroftladAuthor Commented:
Yeh it is an org.w3c.dom.Document.  I'll paste what code I have:

                    TransformerFactory tFact = TransformerFactory.newInstance();
                    Transformer galvatron = tFact.newTransformer();
                    Source soapContent = response.getSOAPPart().getContent();
                    DOMResult result = new DOMResult();
                    galvatron.transform(soapContent, result);
                   
                    org.w3c.dom.Node msgRoot = result.getNode();
                    org.w3c.dom.Element rootEl = ((org.w3c.dom.Document)msgRoot).getDocumentElement();
                    org.w3c.dom.Document doc = (org.w3c.dom.Document)msgRoot;

Then to parse the code I've used:

            if(getPathValue(doc,"//soap:Envelope/soap:Body/GetAppXmlResponse/GetAppXmlResult/Connector/getappxml/scotapp:Proposal/scotapp:ApplicationHeader/scotapp:RefNum").length()>0)
                                          {
                  strVersion="0.8";
            }

Although I think the problem is due to the fact that there is the !CDATA tag at the start of the inner xml file, if you take at look at it again.
0
 
manuel_mCommented:
ok. missed the CDATA thing :-)

You have to get the content of the <getappxml> tag and then you can create a Document from it. After this you can easily read out the RefNum value.
// where xmlText your value from the getappxml tag is.
Document getAppDocument = null;
try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            getAppDocument = builder.parse(new InputSource(new StringReader(xmlText)));
        } catch (SAXException e) {
            throw new UtilRuntimeException("", e);
        } catch (IOException e) {
            throw new UtilRuntimeException("", e);
        } catch (ParserConfigurationException e) {
            throw new UtilRuntimeException("", e);
        }
 
if(getPathValue(getAppDocument,"//Proposal/ApplicationHeader/RefNum").length()>0) {
                  strVersion="0.8";
            }

Open in new window

0
 
moorcroftladAuthor Commented:
plus I'm using JSDK 1.5.1 so I dont have javax.xml.xpath...
0
 
manuel_mConnect With a Mentor Commented:
you should also check if getAppDocument is not null...

manuel
0
 
moorcroftladAuthor Commented:
sorry still don't really understand, I have a Document object (doc) so how does that code you just type create a new document object when it doesnt even reference this.  Can you explain further what the string xmlText is?

Thanks
0
 
moorcroftladAuthor Commented:
The code you mentioned gave me the following error:

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
0
 
manuel_mConnect With a Mentor Commented:
Where does the error occur? Could you please post the complete error message?
0
 
moorcroftladAuthor Commented:
It worked out in the end, I just had to change soap:Envelope to soap-env:Envelope as I am working with an older version of the soap toolkit!

Thanks
0
 
manuel_mCommented:
You're welcome.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.