Describes how JDOM
can be used to prepare request and also to decode a response
// Packages
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
/*
Sample request to be constructed
<Car xmlns="http://xml.abc.com/CAR_2_10">
<Maruti>
<Model>Swift<Model>
<Maruti>
<Car>
Sample response to be decoded
<Car xmlns="http://xml.abc.com/CAR_2_10">
<Maruti>
<Swift>
<Price>550000</Price>
<Color>Blue<Color>
<Swift>
<Maruti>
<Car>
*/
//Request construction using JDOM
Element car = new Element("Car");
Namespace ns = Namespace.getNamespace ("http://xml.abc.com/CAR_2_10");
car.setNamespace(ns);
Element maruti = new Element("Maruti", ns);
Element model = new Element("Model", ns);
model.setText("Swift");
maruti.addContent(model);
car.addContent(maruti);
//Converting Document to String
new XMLOutputter(indent, true).output(document, new StringWriter());
//Decoding a response using JDOM
/*********************Option 1*********************************/
String price = null;
String color = null;
SAXBuilder builder = new SAXBuilder();
StringReader reader = new StringReader(xmlString);
Document doc = builder.build(reader);
Element root = doc.getRootElement();
Namespace ns = Namespace.getNamespace("http://xml.abc.com/CAR_2_10");
Element swift = getRecursiveChild(root, "maruti/swift", ns);
price = swift.getChild("price", ns).getText();
color = swift.getChild("color", ns).getText();
// JDOM does not provide any method to reach into a child under multiple indentations. This method helps to reach into a Grandchild node
public static Element getRecursiveChild(Element start, String path, Namespace ns) {
StringTokenizer names = new StringTokenizer(path, "/");
while (start != null && names.hasMoreTokens()) {
start = start.getChild(names.nextToken(), ns);
}
return start;
}
/***********************Option 2************************************/
//Although option 1 is a better way of reading a Document, it might not be supported in older versions of JDOM. In those cases we can use this option.
String price = null;
String color = null;
SAXBuilder builder = new SAXBuilder();
StringReader reader = new StringReader(xmlString);
Document doc = builder.build(reader);
Element root = doc.getRootElement();
Namespace ns = Namespace.getNamespace("http://xml.abc.com/CAR_2_10");
Iterator itr = (root.getChildren()).iterator();
while (itr.hasNext()) {
Element maruti = (Element) itr.next();
if (!maruti.getName().equals("Maruti"))
continue;
Iterator marutiItr = (maruti.getChildren()).iterator();
while (marutiItr.hasNext()) {
Element swift = (Element) marutiItr.next();
if (!swift.getName().equals("swift"))
continue;
Iterator swiftItr = (swift.getChildren()).iterator();
while (swiftItr.hasNext()) {
Element childElement = (Element) swiftItr.next();
if (childElement.getName().equals("price"))
price = childElement.getText();
else (childElement.getName().equals("color"))
color = childElement.getText();
}
}
}