java学习之xml

xml的处理有两种方式dom和Sax

其中dom有3套api ,分别是dom和jdom和dom4j 

 1 package com.gh.xml;
 2 
 3 import java.io.File;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 import javax.xml.parsers.DocumentBuilder;
 8 import javax.xml.parsers.DocumentBuilderFactory;
 9 
10 import org.w3c.dom.Document;
11 import org.w3c.dom.Node;
12 import org.w3c.dom.NodeList;
13 /**
14  * Dom模式读取xml
15  * @author ganhang
16  *
17  */
18 public class DomDemo {
19     public static void main(String[] args) throws Exception {
20         // 创建dom解析器工厂
21         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
22         // 创建一个dom解析器
23         DocumentBuilder db = dbf.newDocumentBuilder();
24         // 关联文件
25         File f = new File("src/1.xml");
26         // 开始解析
27         Document doc = db.parse(f);// 传文件或者字节流
28         // 根据节点获取数据
29         NodeList nl = doc.getElementsByTagName("teacher");
30         List<Teacher> teachers = new ArrayList<Teacher>();
31         Teacher t = null;
32         for (int i = 0; i < nl.getLength(); i++) {
33             Node teacherNode = nl.item(i);// 获取每个teacher节点
34             // 得到节点的属性id的值
35             String str = teacherNode.getAttributes().getNamedItem("id")
36                     .getNodeValue();
37             //System.out.println(str);
38             t = new Teacher();
39             t.setId(Integer.parseInt(str));
40             // 获取teacher节点下的所有子节点
41             NodeList childNodeList = teacherNode.getChildNodes();
42             //System.out.println(childNodeList.getLength());
43             for (int j = 0; j < childNodeList.getLength(); j++) {
44                 // 注意teacher有三个子节点#text name #text
45                 Node childNode = childNodeList.item(j);
46                 //System.out.println(childNode.getNodeName());
47                 // 取name的子节点的值
48                 if ("name".equals(childNode.getNodeName())) {
49                     t.setName(childNode.getFirstChild().getNodeValue());
50                 }
51             }
52             teachers.add(t);
53         }
54         System.out.println(teachers);
55     }
56 }
 1 package com.gh.xml;
 2 
 3 import java.io.InputStream;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 import org.jdom2.Document;
 8 import org.jdom2.Element;
 9 import org.jdom2.input.SAXBuilder;
10 
11 public class JdomDemo {
12     public static void main(String[] args) throws Exception {
13         SAXBuilder sb = new SAXBuilder();// 创建jdom解析器
14         InputStream in = Thread.currentThread().getContextClassLoader()
15                 .getResourceAsStream("1.xml");
16         Document doc = sb.build(in);
17         //拿根元素
18         Element roote = doc.getRootElement();
19         //根据根元素拿子元素
20         List<Element> liste = roote.getChildren();
21         List<Teacher> teachers=new ArrayList<Teacher>();
22         Teacher t=null;//注意必须要在里面new,不然teachers添加的都是重复的t;
23         //遍历子元素,也可以返回一个iterator遍历;
24         for (int i = 0; i < liste.size(); i++) {
25             t=new Teacher();
26             Element e = liste.get(i);
27             t.setId(Integer.parseInt(e.getAttributeValue("id")));
28             t.setName(e.getChildText("name"));
29             teachers.add(t);
30         }
31         System.out.println(teachers);
32     }
33 }
 1 package com.gh.xml;
 2 
 3 import java.io.File;
 4 import java.util.ArrayList;
 5 import java.util.Iterator;
 6 import java.util.List;
 7 
 8 import org.dom4j.Document;
 9 import org.dom4j.Element;
10 import org.dom4j.io.SAXReader;
11 /**
12  * Dom4j 性能最好
13  * @author ganhang
14  *
15  */
16 public class Dom4jDemo {
17     public static void main(String[] args) throws Exception {
18         SAXReader sr=new SAXReader();
19         File f=new File("src/1.xml");
20         Document doc=sr.read(f);
21         Element roote=doc.getRootElement();
22         Iterator<Element> iters=roote.elementIterator();
23         Teacher t=null;
24         List<Teacher> list=new ArrayList<Teacher>();
25         while(iters.hasNext()){
26             t=new Teacher(); 
27             Element e=iters.next();
28             t.setId(Integer.parseInt(e.attributeValue("id")));
29             t.setName(e.elementText("name"));
30             list.add(t);
31         }
32         System.out.println(list);
33     }
34 }
 1 package com.gh.xml;
 2 
 3 import java.io.InputStream;
 4 
 5 import javax.xml.parsers.SAXParser;
 6 import javax.xml.parsers.SAXParserFactory;
 7 /**
 8  * SAX读xml
 9  * @author ganhang
10  *
11  */
12 public class SaxDemo {
13     public static void main(String[] args) throws Exception {
14         //创建SAX解析器工厂
15         SAXParserFactory spf = SAXParserFactory.newInstance();
16         //创建sax解析器
17         SAXParser sp = spf.newSAXParser();
18         //用字符流读xml
19         InputStream is = Thread.currentThread().getContextClassLoader()
20                 .getResourceAsStream("1.xml");
21         MyHandler dh=new MyHandler();//实例化引擎
22         //开始解析
23         sp.parse(is, dh);
24         System.out.println(dh.getList());
25         
26     }
27 }
 1 package com.gh.xml;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.xml.sax.Attributes;
 7 import org.xml.sax.SAXException;
 8 import org.xml.sax.helpers.DefaultHandler;
 9 /**
10  * Sax模式的事件处理引擎
11  * @author ganhang
12  *
13  */
14 public class MyHandler extends DefaultHandler {
15     private List<Teacher> list = null;
16     private Teacher t = null;
17     private String flag = null;
18     //开始读入文件
19     @Override
20     public void startDocument() throws SAXException {
21         list=new ArrayList<Teacher>();
22     }
23     //开始读元素
24     @Override
25     public void startElement(String uri, String localName, String qName,
26             Attributes attributes) throws SAXException {
27         flag = qName;
28         if ("teacher".equals(qName)) {
29             t=new Teacher();//注意要在这new一个新的Teacher不然list添加会重复
30             t.setId(Integer.parseInt(attributes.getValue("id")));
31             //System.out.println(t.getId());
32         }
33     }
34     //读字符数据
35     @Override
36     public void characters(char[] ch, int start, int length)
37             throws SAXException {
38         if ("name".equals(flag)) {
39             t.setName(new String(ch, start, length));
40              //System.out.println(t.getName());
41         }
42     }
43     //结束元素时干嘛
44     @Override
45     public void endElement(String uri, String localName, String qName)
46             throws SAXException {
47         if ("teacher".equals(qName)) {
48             list.add(t);
49             //System.out.println(list.get(0));
50         }//System.out.println(t);
51             flag = null;
52     }
53     //结束文件时干嘛
54     @Override
55     public void endDocument() throws SAXException {
56         System.out.println("解析成功!");
57         //System.out.println(list.get(0));
58     }
59     public List<Teacher> getList() {
60         return list;
61     }
62 
63 }
 1 package com.gh.xml;
 2 
 3 public class Teacher {
 4     private int id;
 5     private String name;
 6     
 7     public int getId() {
 8         return id;
 9     }
10     public void setId(int id) {
11         this.id = id;
12     }
13     public String getName() {
14         return name;
15     }
16     public Teacher(int id, String name) {
17         this.id = id;
18         this.name = name;
19     }
20     public Teacher() {
21         super();
22     }
23     public void setName(String name) {
24         this.name = name;
25     }
26     @Override
27     public String toString() {
28         return "Teacher [id=" + id + ", name=" + name + "]";
29     }
30 }
 1 package com.gh.xml;
 2 
 3 import java.beans.XMLDecoder;
 4 import java.beans.XMLEncoder;
 5 import java.io.BufferedInputStream;
 6 import java.io.BufferedOutputStream;
 7 import java.io.File;
 8 import java.io.FileInputStream;
 9 import java.io.FileOutputStream;
10 /**
11  * xml和对象之间的转换
12  * @author ganhang
13  *
14  */
15 public class ObjectAndXmlDemo {
16     /**
17      * 把对象转成xml
18      * @param obj
19      * @param file
20      * @throws Exception 
21      */
22     public static void object2xml(Teacher obj,File file) throws Exception{
23         BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
24         XMLEncoder encode=new XMLEncoder(bos);
25         encode.writeObject(obj);
26         encode.flush();
27         encode.close();
28         bos.close();
29         System.out.println("写入成功");
30     }
31     /**
32      * xml转成对象
33      * @param file
34      * @return
35      * @throws Exception
36      */
37     public static Teacher xml2object(File file) throws Exception{
38         BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
39         XMLDecoder decode =new XMLDecoder(bis);
40         Teacher t=(Teacher)decode.readObject();
41         decode.close();
42         bis.close();
43         System.out.println("读入成功");
44         return t;
45     }
46     public static void main(String[] args) throws Exception {
47         //Teacher t=new Teacher(1,"小白");
48         //object2xml(t,new File("src/2.xml"));
49         System.out.println(xml2object(new File("src/2.xml")));
50     }
51 }

1.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <person>
 3     <teacher id="1">
 4         <name>小白</name>
 5         <desc>hehe1</desc>
 6     </teacher>
 7     
 8     <teacher id="2">
 9         <name>小黑</name>
10         <desc>hehe2</desc>
11     </teacher>
12     <teacher id="3">
13         <name>小红</name>
14         <desc>hehe3</desc>
15     </teacher>
16 </person>

2.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <java version="1.7.0_79" class="java.beans.XMLDecoder">
 3  <object class="com.gh.xml.Teacher">
 4   <void property="id">
 5    <int>1</int>
 6   </void>
 7   <void property="name">
 8    <string>小白</string>
 9   </void>
10  </object>
11 </java>
原文地址:https://www.cnblogs.com/ganhang-acm/p/5154405.html