> i hve a xml like this:
> <Students>
[quoted text clipped - 19 lines]
> 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;
}
}
}