SAX解析XML

先给出XML格式:






 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.FileReader;
 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8 import java.util.ArrayList;
 9 import java.util.List;
10 import javax.xml.transform.TransformerException;
11 import org.jdom.Document;
12 import org.jdom.Element;
13 import org.jdom.JDOMException;
14 import org.jdom.input.SAXBuilder;
15 import org.jdom.output.Format;
16 import org.jdom.output.XMLOutputter;
17 
18 public class parser {
19     public static void main(String args[]) throws JDOMException, IOException, TransformerException{
20         BufferedWriter bw = new BufferedWriter(new FileWriter(new File("E:\\1.txt")));
21         SAXBuilder builder = new SAXBuilder();//创建解析builder
22         List l = new ArrayList();
23         String filePath = "D:/xml";
24         File file = new File(filePath);
25         GetFile gf = new GetFile();
26         l = gf.fileReader(file);//得到所要解析的所有文件
27         for(int i=0;i<l.size();i++){
28             BufferedReader bf = new BufferedReader(new FileReader(new File("E:\\2.txt")));
29             Document doc = builder.build(l.get(i).toString().trim());//对文件集中的第i个文件进行处理
30             Element root = doc.getRootElement();//得到XML的根元素book/
31             String str = root.getChildText("dewey");//解析出
32             List<Element> list = root.getChildren("tags");//取到tags节点
33             for(Element tmp:list){
34                 List<Element> tagList = tmp.getChildren();//tagList取到tags节点下的所有tag
35                 for(Element tagTmp:tagList){
36                     String tagValue = tagTmp.getText();//取tag中的内容
37                     String count = tagTmp.getAttributeValue("count");//取tag的属性值
38                     int c = Integer.parseInt(count);//把string的count转换为int类型
39                     System.out.println(count);
40                     if(c>1){                 //将tag中的value复制count次
41                         String result = "";        //
42                         for(int j=0;j<c;j++){        //
43                             result +=" "+ tagValue;  //
44                         }                //end
45                         System.out.println(result);
46                         tagTmp.setText(result);    //把tag的value改写为复制后值
47                         Format format = Format.getRawFormat();//格式化输出
48                         format.setEncoding("UTF-8");      //设置编码,防止改写完乱码
49                         XMLOutputter output = new XMLOutputter(format);//
50                         output.output(doc, new FileOutputStream(l.get(i).toString().trim()));                                          //将结果写入XML  
51                     }
52                 }
53             }
54             if(str.contains("."))
55                 str = str.substring(0, 3);
56             System.out.println(str+"\n");
57             String s = null;
58             while((str!=null)&&(str!="")&&((s=bf.readLine())!=null)){//按行读取2.txt文件中内容
59                 String[] st = s.split("\t");//以tab分割每行内容
60                 String deweyNum = st[0];  //取分割完的第一个值
61                 String deweyClassify =st[1];//
62                 if(str.equals(deweyNum)){   // 将XML中解析到的dewey改为从文本2.txt中读到的值
63                     root.getChild("dewey").setText(deweyClassify);
64                     Format format = Format.getRawFormat();
65                     format.setEncoding("UTF-8");
66                     XMLOutputter output = new XMLOutputter(format);
67                     output.output(doc, new FileOutputStream(l.get(i).toString().trim()));
68                 }
69             }
70             bf.close();    
71     }
72 }
73 }
第三种类型可以这样写:
1 List<Element> editorialreviewContent = XPath.selectNodes(root, "/book/editorialreviews/editorialreview/content");//可以得到editorialreview下的content中的值
2         List<Element> reviewsContent = XPath.selectNodes(root, "/book/reviews/review/content");//可以得到review下的content的值
代码中遇到的方法:
1
getChildren 这个方法可以获取所有子元素(34行) 2 getChildren(tags) 这个方法可以获取所有名称为tags的子节点(32行) 3 getAttributeValue 这个方法可以获取指定属性的值(37行) 4 getChildText 这个方法可以获取子节点的文本值(31行)

 最后SAX的官网

  

      http://www.saxproject.org/

 

posted @ 2014-03-13 10:10  G_xjn  阅读(221)  评论(0编辑  收藏  举报