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.getD ocumentElement(),
NodeFilter.SHOW_ELEMENT, new Filter(), false);
Node n;
while((n = walk.nextNode()) != null) {
newdoc.getDocumentElement().appendChild(newdoc.imp ortNode(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("n umber").getNodeValue());
if(num >= 7 && num <=

{
return NodeFilter.FILTER_ACCEPT;
} else {
return NodeFilter.FILTER_REJECT;
}
} else {
return NodeFilter.FILTER_REJECT;
}
}
}