对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于xml的解析看不懂的可以先去看下我之前关于dom跟sax解析xml的随笔http://www.cnblogs.com/zhi-hao/p/3985720.html,其实理解了解析xml的原理,要想学习jdom跟dom4j就比较简单了,jdom跟dom4j只是基于底层api的更高级的封装,而dom和sax是解析xml的底层接口),我们在使用jdom和dom4j时要导入相应的包,这些包可以到jdom和dom4j的官网去下载。
首先通过jdom来生成xml
1 package xmlTest;
2 /**
3 * @author CIACs
4 */
5 import java.io.FileOutputStream;
6
7 import org.jdom.Document;
8 import org.jdom.Element;
9 import org.jdom.output.Format;
10 import org.jdom.output.XMLOutputter;
11
12 public class Jdom {
13
14 public static void main(String[] args) throws Exception{
15 Document doc = new Document();
16 Element root = new Element("root");
17 doc.addContent(root);
18
19 Element name = new Element("name");
20 root.addContent(name);
21 root.setAttribute("author","CIACs").setAttribute("url", "http://www.cnblogs.com/zhi-hao/");
22 name.addContent("CIACs");
23
24 XMLOutputter out = new XMLOutputter();
25 Format format = Format.getPrettyFormat();
26 format.setIndent(" ");
27 out.setFormat(format);
28 out.output(doc,new FileOutputStream("jdom.xml"));
29
30 }
31
32 }
生成的xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <root author="CIACs" url="http://www.cnblogs.com/zhi-hao/">
3 <name>CIACs</name>
4 </root>
这里生成的xml比较简单,这是为了容易理解,简单的理解了,复杂的其实也就会了。
接下来通过jdom对xml进行解析
1 package xmlTest;
2 /**
3 * @author CIACs
4 */
5 import java.io.File;
6 import java.io.FileOutputStream;
7 import java.util.List;
8
9 import org.jdom.Attribute;
10 import org.jdom.Document;
11 import org.jdom.Element;
12 import org.jdom.input.SAXBuilder;
13 import org.jdom.output.XMLOutputter;
14
15 public class Jdom2 {
16
17 public static void main(String[] args) throws Exception {
18 //通过SAXBuilder解析xml
19 SAXBuilder builder = new SAXBuilder();
20
21 Document doc = builder.build(new File("jdom.xml"));
22
23 Element root = doc.getRootElement();
24
25 System.out.println(root.getName());
26
27 String name = root.getChild("name").getText();
28
29 System.out.println("name: "+name);
30
31 List attrs = root.getAttributes();
32
33 for(int i = 0; i < attrs.size();i++)
34 {
35 String attrName;
36 String attrValue;
37 Attribute attr = (Attribute)attrs.get(i);
38 attrName = attr.getName();
39 attrValue = attr.getValue();
40 System.out.println(attrName+":"+attrValue);
41
42 }
43 //删除属性url,并保存到jdom2.xml
44 root.removeAttribute("url");
45
46 XMLOutputter out = new XMLOutputter();
47 out.output(doc, new FileOutputStream("jdom2.xml"));
48
49
50 }
51 }
控制台窗口输出的结果:
写入jdom2.xml的内容
下面是用dom4j来操作xml
1 package xmlTest;
2 /**
3 * @author CIACs
4 */
5 import java.io.File;
6 import java.io.FileOutputStream;
7 import java.util.List;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.parsers.DocumentBuilderFactory;
11
12 import org.dom4j.Attribute;
13 import org.dom4j.Document;
14 import org.dom4j.DocumentFactory;
15 import org.dom4j.DocumentHelper;
16 import org.dom4j.Element;
17 import org.dom4j.io.DOMReader;
18 import org.dom4j.io.OutputFormat;
19 import org.dom4j.io.SAXReader;
20 import org.dom4j.io.XMLWriter;
21
22 public class Dom4j {
23 public static void main(String[] args) throws Exception {
24 //创建文档跟节点
25 Document doc = DocumentFactory.getInstance().createDocument();
26 Element root = DocumentHelper.createElement("root");
27 doc.setRootElement(root);
28
29 Element name = DocumentHelper.createElement("name");
30 name.setText("CIACs");
31 name.addAttribute("age", "22");
32 root.add(name);
33 root.addElement("address").addAttribute("province", "guangdong").addElement("country").setText("guangzhou");
34
35 //生成的xml输出到命令行窗口
36 OutputFormat format = new OutputFormat(" ",true);
37 XMLWriter writer = new XMLWriter(format);
38 writer.write(doc);
39
40 XMLWriter writer2 = new XMLWriter(new FileOutputStream(new File("dom4j.xml")),format);
41 //生成的xml写到内存中
42 writer2.write(doc);
43
44
45 System.out.println("-----------通过SAXReader来解析xml文档-----------");
46 SAXReader reader = new SAXReader();
47 Document doc2 = reader.read(new File("dom4j.xml"));
48 Element root2 = doc2.getRootElement();
49
50 parse(root2);
51
52 System.out.println("---------通过DOMReader来解析xml文档-------------");
53
54 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
55 DocumentBuilder db = dbf.newDocumentBuilder();
56 //当一个程序中引用同名不同包的两个Document,其中一个必须要加包名加以区别
57 org.w3c.dom.Document doc3 = db.parse(new File("dom4j.xml"));
58 DOMReader domReader = new DOMReader();
59 //将JAXP的document转换为dom4j的document
60 Document doc4 = domReader.read(doc3);
61 //获得根元素的名称
62 String rootName = doc4.getRootElement().getName();
63 System.out.println(rootName);
64
65 }
66
67 public static void parse(Element element)
68 {
69 List<Attribute> list = element.attributes();
70 if(!list.isEmpty())
71 {
72 for(Attribute attr:list)
73 {
74 System.out.println("属性:"+attr.getName()+"="+attr.getText());
75 }
76 }
77 List<Element> list2 = element.elements();
78 for(int i=0;i<list2.size();i++)
79 {
80
81
82
83 if(list2.get(i).elements().size()>=1)
84 {
85 System.out.println(list2.get(i).getName());
86 parse(list2.get(i));
87 }
88 else
89 {
90 System.out.println(list2.get(i).getName()+": "+list2.get(i).getText());
91 }
92
93
94 List<Attribute> list3 = list2.get(i).attributes();
95 if(!list3.isEmpty())
96 {
97 for(Attribute attr:list3)
98 {
99 System.out.println("属性:"+attr.getName()+"="+attr.getText());
100 }
101 }
102
103
104 }
105
106 }
107