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的官网