Parsing Soap Response in java

E

emmna.90

Hi,i need to parse a soap response from an xml fileb in java to get some specific values of it .For example ,i need to have the value v1 of string parameter in operationname1 and v2 of string parameter of operationname2.i tried with some tuto in the net but it doesn't work for me .I will be very thankful if you can help me .
Here is the soap response.xml.


<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...">
<soapenv:Body>
<ns1:CommandResponseData xmlns:ns1="...">
<ns1:CommandResult>
<ns1:TransactionResult>
<ns1:OperationResult>
<ns1:Operation name="operationname1" modifier="modify1">
<ns1:parameterList>
<ns1:StringParameter name="n1">v1</ns1:StringParameter>
<ns1:DateTimeParametername="d1">value</ns1:DateTimeParameter>
</ns1:parameterList>
</ns1:Operation>

</ns1:Operation>
<ns1:Operation name="operationname2" modifier="modify2">
<ns1:parameterList>
<ns1:StringParameter name="c1">v2</ns1:StringParameter>
</ns1:parameterList>
</ns1:Operation>
</ns1:OperationResult>
</ns1:TransactionResult>
</ns1:CommandResult>
</ns1:CommandResponseData>
</soapenv:Body>
</soapenv:Envelope>
 
R

Roedy Green

Hi,i need to parse a soap response from an xml fileb in java to get some s=
pecific values of it .For example ,i need to have the value v1 of string pa=
rameter in operationname1 and v2 of string parameter of operationname2.i tr=
ied with some tuto in the net but it doesn't work for me .I will be very t=
hankful if you can help me .
Here is the soap response.xml.

I parse the soap responses from Amazon that tells me which books they
have in stock.

You need a Jax-compatible descriptor of the soap records. It then
generates you Java sourcecode to parse the incoming stream.

You then navigate the tree to pick out what you want.

see http://mindprod.com/jax.html

Amazon provides a descriptor file
AWSECommerceService.wsdl

that looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
targetNamespace="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
<types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
targetNamespace="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
elementFormDefault="qualified">
<xs:element name="Bin">
<xs:complexType>
<xs:sequence>
....
 
A

Arne Vajhøj

Hi,i need to parse a soap response from an xml fileb in java to get
some specific values of it .For example ,i need to have the value v1 of
string parameter in operationname1 and v2 of string parameter of
operationname2.i tried with some tuto in the net but it doesn't work
for me.

Here is the soap response.xml.

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...">
<soapenv:Body>
<ns1:CommandResponseData xmlns:ns1="...">
<ns1:CommandResult>
<ns1:TransactionResult>
<ns1:OperationResult>
<ns1:Operation name="operationname1" modifier="modify1">
<ns1:parameterList>
<ns1:StringParameter name="n1">v1</ns1:StringParameter>
<ns1:DateTimeParametername="d1">value</ns1:DateTimeParameter>
</ns1:parameterList>
</ns1:Operation>

</ns1:Operation>
<ns1:Operation name="operationname2" modifier="modify2">
<ns1:parameterList>
<ns1:StringParameter name="c1">v2</ns1:StringParameter>
</ns1:parameterList>
</ns1:Operation>
</ns1:OperationResult>
</ns1:TransactionResult>
</ns1:CommandResult>
</ns1:CommandResponseData>
</soapenv:Body>
</soapenv:Envelope>

0) That is not the SOAP result as it is not well formed XML.

I will assume it looks like:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...">
<soapenv:Body>
<ns1:CommandResponseData xmlns:ns1="...">
<ns1:CommandResult>
<ns1:TransactionResult>
<ns1:OperationResult>
<ns1:Operation name="operationname1"
modifier="modify1">
<ns1:parameterList>
<ns1:StringParameter
name="n1">v1</ns1:StringParameter>
<ns1:DateTimeParameter
name="d1">value</ns1:DateTimeParameter>
</ns1:parameterList>
</ns1:Operation>
<ns1:Operation name="operationname2"
modifier="modify2">
<ns1:parameterList>
<ns1:StringParameter
name="c1">v2</ns1:StringParameter>
</ns1:parameterList>
</ns1:Operation>
</ns1:OperationResult>
</ns1:TransactionResult>
</ns1:CommandResult>
</ns1:CommandResponseData>
</soapenv:Body>
</soapenv:Envelope>

1) If you are process XML when you are doing SOAP then you are most
like doing it wrong. You should be generating stub code from the
WSDL and just make a method call and not worry about XML at all.

2) If you really need to parse the response manually, then I will
recommend using XPath.

Example reading the above XML from a disk file soap.xml:

import java.io.FileReader;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class ManualSoapParse {
public static void main(String[] args) throws
ParserConfigurationException, SAXException, IOException,
XPathExpressionException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(new
FileReader("/work/soap.xml")));
XPath xpath = XPathFactory.newInstance().newXPath();
Node n1 =
(Node)xpath.evaluate("//Envelope/Body/CommandResponseData/CommandResult/TransactionResult/OperationResult/Operation[@name='operationname1']/ParameterList/StringParameter[@name='n1']/text()",
doc.getDocumentElement(), XPathConstants.NODE);
System.out.println(n1.getNodeValue());
Node c1 =
(Node)xpath.evaluate("//Envelope/Body/CommandResponseData/CommandResult/TransactionResult/OperationResult/Operation[@name='operationname2']/ParameterList/StringParameter[@name='c1']/text()",
doc.getDocumentElement(), XPathConstants.NODE);
System.out.println(c1.getNodeValue());
}
}

Note that I cheated and ignored namespaces. You can handle namespaces if
you need to or want to.

Arne
 
E

Emna Sabri

Le samedi 5 avril 2014 03:50:42 UTC+1, Arne Vajhøj a écrit :
Hi,i need to parse a soap response from an xml fileb in java to get
some specific values of it .For example ,i need to have the value v1 of
string parameter in operationname1 and v2 of string parameter of
operationname2.i tried with some tuto in the net but it doesn't work
for me.

Here is the soap response.xml.

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...">

<ns1:CommandResponseData xmlns:ns1="...">



<ns1:Operation name="operationname1" modifier="modify1">

<ns1:StringParameter name="n1">v1</ns1:StringParameter>





<ns1:Operation name="operationname2" modifier="modify2">

<ns1:StringParameter name="c1">v2</ns1:StringParameter>







</soapenv:Envelope>



0) That is not the SOAP result as it is not well formed XML.



I will assume it looks like:



<?xml version='1.0' encoding='utf-8'?>

<soapenv:Envelope xmlns:soapenv="...">

<soapenv:Body>

<ns1:CommandResponseData xmlns:ns1="...">

<ns1:CommandResult>

<ns1:TransactionResult>

<ns1:OperationResult>

<ns1:Operation name="operationname1"

modifier="modify1">

<ns1:parameterList>

<ns1:StringParameter

name="n1">v1</ns1:StringParameter>

<ns1:DateTimeParameter

name="d1">value</ns1:DateTimeParameter>

</ns1:parameterList>

</ns1:Operation>

<ns1:Operation name="operationname2"

modifier="modify2">

<ns1:parameterList>

<ns1:StringParameter

name="c1">v2</ns1:StringParameter>

</ns1:parameterList>

</ns1:Operation>

</ns1:OperationResult>

</ns1:TransactionResult>

</ns1:CommandResult>

</ns1:CommandResponseData>

</soapenv:Body>

</soapenv:Envelope>



1) If you are process XML when you are doing SOAP then you are most

like doing it wrong. You should be generating stub code from the

WSDL and just make a method call and not worry about XML at all.



2) If you really need to parse the response manually, then I will

recommend using XPath.



Example reading the above XML from a disk file soap.xml:



import java.io.FileReader;

import java.io.IOException;



import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

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.Node;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;



public class ManualSoapParse {

public static void main(String[] args) throws

ParserConfigurationException, SAXException, IOException,

XPathExpressionException {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setNamespaceAware(false);

DocumentBuilder db = dbf.newDocumentBuilder();

Document doc = db.parse(new InputSource(new

FileReader("/work/soap.xml")));

XPath xpath = XPathFactory.newInstance().newXPath();

Node n1 =

(Node)xpath.evaluate("//Envelope/Body/CommandResponseData/CommandResult/TransactionResult/OperationResult/Operation[@name='operationname1']/ParameterList/StringParameter[@name='n1']/text()",

doc.getDocumentElement(), XPathConstants.NODE);

System.out.println(n1.getNodeValue());

Node c1 =

(Node)xpath.evaluate("//Envelope/Body/CommandResponseData/CommandResult/TransactionResult/OperationResult/Operation[@name='operationname2']/ParameterList/StringParameter[@name='c1']/text()",

doc.getDocumentElement(), XPathConstants.NODE);

System.out.println(c1.getNodeValue());

}

}



Note that I cheated and ignored namespaces. You can handle namespaces if

you need to or want to.



Arne

hi Arne ,thank you for your response ,i used the 2nd issue to manually parse the soap response and it gives me errors in this line (System.out.println(n1.getNodeValue());)
I have even added the namespace context by adding this code NamespaceContext ctx = new NamespaceContext() {

public String getNamespaceURI(String prefix) {
String uri;
if (prefix.equals("ns1")) {
uri = "uri of ns1";
} else {
uri = null;
}
return uri;
}

public String getPrefix(String namespaceURI) {
throw new UnsupportedOperationException("Not supported yet.");
}

public Iterator getPrefixes(String namespaceURI) {
throw new UnsupportedOperationException("Not supported yet.");
}
};
and still haven't succeed to get the values .
Thanks in advance for your help .
 
S

Silvio

Hi,i need to parse a soap response from an xml fileb in java to get some specific values of it .For example ,i need to have the value v1 of string parameter in operationname1 and v2 of string parameter of operationname2.i tried with some tuto in the net but it doesn't work for me .I will be very thankful if you can help me .
Here is the soap response.xml.


<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...">
<soapenv:Body>
<ns1:CommandResponseData xmlns:ns1="...">
<ns1:CommandResult>
<ns1:TransactionResult>
<ns1:OperationResult>
<ns1:Operation name="operationname1" modifier="modify1">
<ns1:parameterList>
<ns1:StringParameter name="n1">v1</ns1:StringParameter>
<ns1:DateTimeParametername="d1">value</ns1:DateTimeParameter>
</ns1:parameterList>
</ns1:Operation>

</ns1:Operation>
<ns1:Operation name="operationname2" modifier="modify2">
<ns1:parameterList>
<ns1:StringParameter name="c1">v2</ns1:StringParameter>
</ns1:parameterList>
</ns1:Operation>
</ns1:OperationResult>
</ns1:TransactionResult>
</ns1:CommandResult>
</ns1:CommandResponseData>
</soapenv:Body>
</soapenv:Envelope>


What you want would be ease to do with DOM plus maybe some XPath if the
XML where valid, which it is not.

Silvio
 
E

Emna Sabri

Le vendredi 11 avril 2014 12:49:54 UTC+1, Silvio a écrit :
What you want would be ease to do with DOM plus maybe some XPath if the

XML where valid, which it is not.



Silvio

Sorry but how can i parse the soap response if it isn't with xml parsing ?
 
S

Silvio

Le vendredi 11 avril 2014 12:49:54 UTC+1, Silvio a écrit :

Sorry but how can i parse the soap response if it isn't with xml parsing ?

It would be with XML parsing IF it where actual XML. What you have
provided is not valid XML and can therefore not be parsed with an XML
parser. Are you sure you posted an actual sample of what you are trying
to parse?
 
A

Arne Vajhøj

i used the 2nd issue to manually parse the soap response and it gives me errors in this line (System.out.println(n1.getNodeValue());)

Do you expect us to be able to guess what the problem is without you
telling us what "gives me errors" covers?

Arne
 
A

Arne Vajhøj

Sorry but how can i parse the soap response if it isn't with xml parsing ?

If you have a strong desire for some unmaintainable code, then there are
lots of possibilities in String indexOf and String substring.

Arne
 
E

Emna Sabri

Le samedi 12 avril 2014 03:05:24 UTC+2, Arne Vajhøj a écrit :
If you have a strong desire for some unmaintainable code, then there are

lots of possibilities in String indexOf and String substring.



Arne

Hi ,i solved the problem :) your response helps me a lot ,in fact the faultwas when copying values .Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,037
Messages
2,570,371
Members
47,013
Latest member
JewellChes

Latest Threads

Top