Re: get a xml node as-it-is
ArunDhaJ wrote:
i hve a xml like this:
<Students>
<Student name = "arun1" number="6">
<Student name = "arun2" number="7">
<Student name = "arun3" number="8">
<Student name = "arun4" number="9">
...
...
...
</Students>
i need to build a new xml or a string from this with few student
nodes.... some thing like this..
<Student>
<Student name = "arun2" number="7">
<Student name = "arun3" number="8">
</Student>
by selecting only the two nodes.........
is there any api which should return some thing like this
"<Student name = "arun2" number="7">"
It can be done in many different ways: getElementsByTagName,
XPath etc., but just for the fun of it I tried using one
of the less known features of W3C DOM - the Walker. See code
below.
Arne
==================================================
import java.io.File;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
public class Selection {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("C:\\stud.xml"));
Document newdoc = db.newDocument();
newdoc.appendChild(newdoc.createElement("Students"));
TreeWalker walk =
((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(),
NodeFilter.SHOW_ELEMENT, new Filter(), false);
Node n;
while((n = walk.nextNode()) != null) {
newdoc.getDocumentElement().appendChild(newdoc.importNode(n, true));
}
OutputFormat fmt = new OutputFormat();
fmt.setIndenting(true);
XMLSerializer ser = new XMLSerializer(new
FileOutputStream("C:\\stud2.xml"), fmt);
ser.serialize(newdoc);
}
}
class Filter implements NodeFilter {
public short acceptNode(Node n) {
if(n.getNodeName().equals("Student")) {
int num =
Integer.parseInt(n.getAttributes().getNamedItem("number").getNodeValue());
if(num >= 7 && num <= 8) {
return NodeFilter.FILTER_ACCEPT;
} else {
return NodeFilter.FILTER_REJECT;
}
} else {
return NodeFilter.FILTER_REJECT;
}
}
}