get a xml node as-it-is

A

ArunDhaJ

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

Thanks
ArunDhaJ
 
A

Arne Vajhøj

ArunDhaJ said:
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;
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top