f



get a xml node as-it-is

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 studentnodes.... 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">"ThanksArunDhaJ
0
ArunDhaJ
1/17/2008 7:27:52 AM
comp.lang.java.programmer 52714 articles. 1 followers. Post Follow

1 Replies
435 Views

Similar Articles

[PageSpeed] 23

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;
         }
     }
}
0
ISO
1/19/2008 4:42:15 AM
Reply: