I want to Update a xml, want to take few nodes in middle at trn node and place them in root node and i want keep the trn node child remain same. But the child nodes in trn node are roved in end result. I am not sure what wrong i am doing. I have below xml like structure
<xyz>
<root>
<content>
<trn>
<a> ...
</a>
<b> ...
</b>
</trn>
</content>
</root>
</xyz>
Want to modify like below xml
<xyz>
<root>
<content>
<trn>
<a> ...
</a>
<b> ...
</b>
</trn>
</content>
</root>
<newNode>
<a> ...
</a>
<b> ...
</b>
</newNode>
</xyz>
But the output XML is as below
<xyz>
<root>
<content>
<trn>
</trn>
</content>
</root>
<newNode>
<a> ...
</a>
<b> ...
</b>
</newNode>
</xyz>
Below is my code. anything i am missing?
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Service {
private static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<xyz>\r\n"
+ " <root>\r\n"
+ " <content>\r\n"
+ " <trn>\r\n"
+ " <a> ...\r\n"
+ " </a>\r\n"
+ " <b> ...\r\n"
+ " </b>\r\n"
+ " </trn>\r\n"
+ " </content>\r\n"
+ " </root>\r\n"
+ " </xyz>";
public void send(String input){
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(XML.getBytes("UTF-8")));
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tFormer = tFactory.newTransformer();
Element element = (Element) doc.getElementsByTagName("root").item(0);
Element formInfo = doc.createElement("newNode");
NodeList lt = doc.getElementsByTagName("trn");
Node RequestDetail = null;
Node ResponseDetail = null;
for (int i = 0; i < lt.getLength(); i++) {
// get first staff
Node t = lt.item(i);
if (t.getNodeType() == Node.ELEMENT_NODE) {
String id = t.getNodeName();
if ("trn".equals(id.trim())) {
NodeList childNodes = t.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
if (item.getNodeType() == Node.ELEMENT_NODE) {
if ("a".equalsIgnoreCase(item.getNodeName())) {
RequestDetail = item;
} else if ("b".equalsIgnoreCase(item.getNodeName())) {
ResponseDetail = item;
}
}
}
}
}
}
//NodeList re = doc.getElementsByTagName("RequestDetail");
//NodeList p = doc.getElementsByTagName("ResponseDetail");
//Node node1 = re.item(0);
//Node node2 = p.item(0);
formInfo.appendChild(RequestDetail);
formInfo.appendChild(ResponseDetail);
element.getParentNode().appendChild(formInfo);
doc.normalize();
Source source = new DOMSource(doc);
Result dest = new StreamResult(System.out);
tFormer.transform(source, dest);
} catch (Exception e) {
e.printStackTrace();
}
}
}