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:
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.
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"