webForumDet fria alternativet

Läsa av SOAP-meddelanden

Java

4 svar · 870 visningar · startad av SPiN

Medlem sedan mars 20007 896 inlägg
Frågan#1

Hej!

Jag har lite problem att läsa av SOAP-meddelanden som jag får i retur. Eller problem, och problem - jag anser att det är väldigt omständigt på nuvarande sätt.

Jag har ett SOAP-meddelande som ser ut som följer:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ElementForValidation xmlns="https://servicepath/theService.asmx/">
      <Result>TheReturnedResult</Result>
    </ElementForValidation>
  </soap:Body>
</soap:Envelope>

För tillfället använder jag JDOM för att utläsa vad jag har fått i retur.

Kan man inte kapsla in den i ett SOAPMessage på någon smart sätt, och sedan fortsätta utläsningen därifrån?

Med vänliga,
SPiN

Medlem sedan sep. 2001961 inlägg
#2

Tja, kanske genom att använda dig av t.ex. org.apache.axis.MessageContext eller liknande. Vilket SOAP-ramverk använder du??

Jag använder annars en kombination av JAXB (för att binda data i SOAP-msg till interna data-bönor) och JAXP om det handlar mer om att processa data.

Annars är Apache Common Digester ganska bra att använda också.

Medlem sedan mars 20007 896 inlägg
#3

Skulle du vilja visa lite hur du skulle läsa av meddelandet över med JAXP? Jag har tittat tidigare på JAXP, men tyckte att det var ännu omständigare att använda det än vad det är att använda JDOM. ;)

Anledningen till att jag vill bort från JDOM är att jag inte kan söka i trädstrukturen genom att använda elementens namn. Jag får stega igenom elementen tills jag kommer fram till värdena, men jag kan ju aldrig då vara säker på att det är i rätt element jag befinner mig.
Ex:

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("xml-fil");
Element root = doc.getRootElement();

Element e = (Element)root.getChildren().get(0);
Element n = (Element)e.getChildren().get(0);
Element m = (Element)n.getChildren().get(0);
String result = ((Element)m.getChildren().get(0)).getText();

Som man ser så har jag ingen möjlighet att se vilket element jag befinner mig i. Och ja, jag vet att det finns en metod

Element.getChild(String elementName)

, men av någon anledning får jag bara NullPointerException när jag försöker söka med namn.

Medlem sedan feb. 200563 inlägg
#4

SPiN skrev:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ElementForValidation xmlns="https://servicepath/theService.asmx/">
      <Result>TheReturnedResult</Result>
    </ElementForValidation>
  </soap:Body>
</soap:Envelope>

För tillfället använder jag JDOM för att utläsa vad jag har fått i retur.

SPiN skrev:

...Anledningen till att jag vill bort från JDOM är att jag inte kan söka i trädstrukturen genom att använda elementens namn....

Du kan använda XPath med JDOM, och då specar du ju elementens namn...

Det är i princip ganska trivialt att söka med XPath, men det som gör att koden trots allt blir hyfsat lång är hanteringen av namespaces.
Du kan även skippa JDOM och använda XPath med JAXP men då blir det ännu mer omfattande kod än med JDOM eftersom man då måste implementera interfacet NamespaceContext. Exempel med JAXP/XPath/Namespaces:
http://www.edankert.com/defaultnamespaces.html#JAXP_XPathFactory

Så här kan du plocka ut strängen med JDOM/XPath/Namespaces:

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.xpath.XPath;
...
	Document doc = ...
	String xpathExpression = "/soap:Envelope/soap:Body/d:ElementForValidation/d:Result";	
	XPath xpath = XPath.newInstance(xpathExpression);
	xpath.addNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
	xpath.addNamespace("d", "https://servicepath/theService.asmx/");
	Element element = (Element)xpath.selectSingleNode(doc);
	String result = element.getText(); // result = "TheReturnedResult"
Medlem sedan mars 20007 896 inlägg
#5

Sweet, det ser väldigt bra ut. Tack för informationen. :)

325 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
190 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)