本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容
1、xml解析的含义
2、XML的解析方式
3、xml的解析工具
4、XML的解析原理
5、实例
6、附录1(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
7、附录2(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
8、附录3(把xml文档中的信息封装到对象中)
1、xml解析的含义
xml文件除了给开发者看,更多情况下是使用程序读取xml文件中的内容
2、XML的解析方式
DOM解析
SAX解析
3、xml的解析工具
3.1、DOM解析工具
1.JAXP(oracle-Sun公司官方)
2.JDOM工具(非官方)
3.Dom4j工具(非官方的)。 三大框架(默认读取xml的工具就是DOM4j)
3.2、SAX解析工具
1.Sax解析工具(oracle-Sun公司官方)
4、XML的解析原理
4.1、DOM解析的原理
xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一个Document的对象树,通过document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容.
缺点:内存消耗大
优点:文档增删改查比较容易

4.2、SAX解析的原理
从上往下读,读一行处理一行。 DOM与SAX解析的区别 SAX解析原理
优点:内存消耗小,适合读
缺点:不适合增删改
5、实例
例1:
1 package com.bw.test;
2
3 import org.dom4j.Document;
4 import org.dom4j.DocumentException;
5 import org.dom4j.io.SAXReader;
6
7 public class Demo1 {
8 /*
9 * 第一个Dom4j读取xml文档的例子
10 *
11 * */
12 public static void main(String[] args) {
13 try {
14 //1.创建一个xml解析器对象
15 SAXReader reader = new SAXReader();
16 //2.读取xml文档,返回Document对象
17 Document doc= reader.read("./src/contact.xml");
18 System.out.println(doc);
19 } catch (DocumentException e) {
20 // TODO Auto-generated catch block
21 e.printStackTrace();
22 }
23 }
24 }
contact.xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <contactList> 3 <contact id="001" sex="男"> 4 <name>张三</name> 5 <age>18</age> 6 <phone>15779593710</phone> 7 <email>872855221@qq.com</email> 8 <qq>872855221</qq> 9 <abc> 10 <a><b></b></a> 11 </abc> 12 </contact> 13 <contact id="038"> 14 <name>李四</name> 15 <age>20</age> 16 <phone>1314580</phone> 17 <email>12580@qq.com</email> 18 <qq>832144529</qq> 19 </contact> 20 </contactList>
例2:
1 package com.shore.test;
2
3 import java.io.File;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.dom4j.Document;
8 import org.dom4j.DocumentException;
9 import org.dom4j.Element;
10 import org.dom4j.Node;
11 import org.dom4j.io.SAXReader;
12 import org.junit.Test;
13
14 /**
15 * @author DSHORE / 2018-8-29
16 *
17 */
18 public class Demo1 {
19 @Test
20 public void test1() throws DocumentException{
21 //1.读取xml文档,返回一个document对象
22 SAXReader reader=new SAXReader();
23 Document doc=reader.read(new File("./src/contact.xml"));
24 //nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
25 Iterator<Node> it=doc.nodeIterator();
26 while(it.hasNext()){//判断是否有下一位元素
27 Node node=it.next();
28 System.out.println(node.getName());
29 //继续获取下面的子节点
30 //只有标签有子节点
31 //判断当前节点是否为标签节点
32 if(node instanceof Element){
33 Element elem=(Element)node;
34 Iterator<Node> it2=elem.nodeIterator();
35 while(it2.hasNext()){
36 Node n2=it2.next();
37 System.out.println(n2.getName());
38 }
39 }
40 }
41 }
42 }
实例结果图

附录1
1 package com.shore.test;
2
3 import java.io.File;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.dom4j.Attribute;
8 import org.dom4j.Document;
9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.Node;
12 import org.dom4j.io.SAXReader;
13 import org.junit.Test;
14
15 /**
16 * @author DSHORE / 2018-8-29
17 *
18 */
19 /*
20 * 第二个dom4j读取的xml文件内容
21 * 节点
22 * 标签
23 * 属性
24 * 文本
25 * */
26 public class Demo1 {
27 @Test
28 public void test1() throws DocumentException{
29 //1.读取xml文档,返回一个document对象
30 SAXReader reader=new SAXReader();
31 Document doc=reader.read(new File("./src/contact.xml"));
32 //nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
33 Iterator<Node> it=doc.nodeIterator();
34 while(it.hasNext()){//判断是否有下一位元素
35 Node node=it.next();
36 System.out.println(node.getName());
37 //继续获取下面的子节点
38 //只有标签有子节点
39 //判断当前节点是否为标签节点
40 if(node instanceof Element){
41 Element elem=(Element)node;
42 Iterator<Node> it2=elem.nodeIterator();
43 while(it2.hasNext()){
44 Node n2=it2.next();
45 System.out.println(n2.getName());
46 }
47 }
48 }
49 }
50 /*
51 * 遍历xml文件的所有节点
52 * */
53 @Test
54 public void test2() throws DocumentException{
55 //1.读取xml文档获取Document对象
56 SAXReader reader=new SAXReader();
57 Document doc=reader.read(new File("./src/contact.xml"));
58 //得到跟标签
59 Element rootEls=doc.getRootElement();
60 getChildNodes(rootEls);
61 }
62 /*
63 * 获取传入标签下的所有子标签
64 * */
65 private void getChildNodes(Element rootEls) {
66 if(rootEls instanceof Element){
67 System.out.println(rootEls.getName());
68 }
69 //得到子节点
70 Iterator<Node> it=rootEls.nodeIterator();
71 while(it.hasNext()){
72 Node node=it.next();
73 //判断是否是标签节点
74 if(node instanceof Element){
75 Element el=(Element)node;
76 //递归
77 getChildNodes(el);
78 }
79 }
80 }
81 /*
82 * 获取标签
83 * */
84 @Test
85 public void test3() throws DocumentException{
86 //1.读取xml文档,返回Document对象
87 SAXReader reader=new SAXReader();
88 Document doc=reader.read(new File("./src/contact.xml"));
89 //得到跟标签
90 Element elt=doc.getRootElement();
91 //得到标签名称
92 String name=elt.getName();
93 System.out.println(name);//返回值:contactList
94
95 //方法1:得到当前标签下指定的名称的第一个子标签
96 Element contactElem=elt.element("contact");
97 String name1=contactElem.getName();
98 System.out.println(name1);//返回值:contact
99
100 //方法2:得到当前根标签下的所有下一级子标签
101 List<Element> list=elt.elements();
102 //遍历list
103 //1).传统的for循环 2).增强for循环 3).迭代器
104 for(int i=0;i<list.size();i++){
105 Element e=list.get(i);
106 System.out.println(e.getName());//返回值:contact 注意:这里的返回值是有两个contact,因为contact.xml文件中有两个根标签的下一级标签contact(两个contact是同一级)
107 }
108 for (Element e : list) {//增强for循环
109 System.out.println(e.getName());//返回值:contact 同上
110 }
111 Iterator<Element> it=list.iterator();
112 while(it.hasNext()){//迭代器
113 Element e=it.next();
114 System.out.println(e.getName());//返回值:contact 同上
115 }
116
117 //方法3:获取更深层次标签(方法只能一层层地获取)
118 Element element=doc.getRootElement().element("contact").element("name");
119 System.out.println(element.getName());//返回值:name
120 }
121 /*
122 * 获取属性值
123 * */
124 @Test
125 public void test4() throws DocumentException{
126 //1.读取xml文档,返回一个Document对象
127 SAXReader reader=new SAXReader();
128 Document doc=reader.read(new File("./src/contact.xml"));
129 //获取属性(先获取标签对象,然后在获取属性)
130 //获得标签对象
131 Element contactElt=doc.getRootElement().element("contact");
132 //获取属性,得到指定名称属性值
133 String idValue=contactElt.attributeValue("id");
134 System.out.println(idValue);//返回值:001
135 //得到指定属性名称的属性对象
136 Attribute idAttr=contactElt.attribute("id");
137 //getName()属性名 getValue属性值
138 System.out.println(idAttr.getName()+"/"+idAttr.getValue());//返回值:id/001
139 }
140 }
结果图

注:test3()的结果,看代码中的注释
附录2
1 package com.shore.test;
2
3 import java.io.File;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.dom4j.Attribute;
8 import org.dom4j.Document;
9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 import org.junit.Test;
13 /**
14 * @author DSHORE / 2018-8-29
15 *
16 */
17
18 public class Demo2 {
19 /*
20 * 获取属性
21 * */
22 @Test
23 public void test() throws DocumentException{
24 //1.解析xml文档,返回一个document对象
25 Document doc=new SAXReader().read(new File("./src/contact.xml"));
26 //获取属性:(先获取属性所在标签对象,然后才能获取属性值)
27 //2.得到标签
28 Element elt=doc.getRootElement().element("contact");
29 //3.得到属性
30 //得到指定名称的属性值
31 String idValue=elt.attributeValue("id");
32 System.out.println(idValue);//返回值:001
33 //得到指定名称的属性对象
34 Attribute aib=elt.attribute("id");
35 //getName() 属性名称 getValue()属性值
36 System.out.println("属性名称:"+aib.getName()+"/"+"属性值:"+aib.getValue());//返回值:属性名称:id/属性值:001
37
38 //方式1:得到所有属性对象,返回一个list()
39 List<Attribute> list=elt.attributes();
40 for (Attribute attr: list) {
41 System.out.println(attr.getName());//返回值:id/001 sex/男
42 }
43
44 //方式2:得到所有属性对象,返回一个迭代器
45 Iterator<Attribute> attr2=elt.attributeIterator();
46 while(attr2.hasNext()){
47 Attribute a=attr2.next();
48 System.out.println(a.getName()+"/"+a.getValue());//返回值:id/001 sex/男
49 }
50 }
51 /*
52 * 获取文本内容
53 * */
54 @Test
55 public void test2() throws DocumentException{
56 //1.解析xml文档,返回一个document对象
57 Document doc=new SAXReader().read(new File("./src/contact.xml"));
58 /*
59 * 注意:空格和换行也是xml的内容
60 * */
61 String content=doc.getRootElement().getText();
62 //获取文本内容(先获取标签,在获取标签上的内容)
63 Element elt=doc.getRootElement().element("contact").element("name");
64 //方式1:得到文本内容
65 String test=elt.getText();
66 System.out.println(test);//返回值:张三
67
68 //方式2:得到指定标签的文本内容
69 String test2=doc.getRootElement().element("contact").elementText("phone");
70 System.out.println(test2); //返回值:15779593710
71 }
72 }
附录3
contact.xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <contactList> 3 <contact id="001" sex="男"> 4 <name>张三</name> 5 <age>18</age> 6 <phone>15779593710</phone> 7 <email>872855221@qq.com</email> 8 <qq>872855221</qq> 9 <abc> 10 <a> </a> 11 </abc> 12 </contact> 13 <contact id="038"> 14 <name>李四</name> 15 <age>20</age> 16 <phone>1314580</phone> 17 <email>12580@qq.com</email> 18 <qq>832144529</qq> 19 </contact> 20 </contactList>
Contact实体(模型)
1 package com.shore.test;
2
3 /**
4 * @author DSHORE / 2018-8-29
5 *
6 */
7 public class Contact {
8 private String id;
9 private String name;
10 private String age;
11 private String phone;
12 private String email;
13 private String qq;
14
15 public String getId() {
16 return id;
17 }
18 public void setId(String id) {
19 this.id = id;
20 }
21 public String getName() {
22 return name;
23 }
24 public void setName(String name) {
25 this.name = name;
26 }
27 public String getAge() {
28 return age;
29 }
30 public void setAge(String age) {
31 this.age = age;
32 }
33 public String getPhone() {
34 return phone;
35 }
36 public void setPhone(String phone) {
37 this.phone = phone;
38 }
39 public String getEmail() {
40 return email;
41 }
42 public void setEmail(String email) {
43 this.email = email;
44 }
45 public String getQq() {
46 return qq;
47 }
48 public void setQq(String qq) {
49 this.qq = qq;
50 }
51 @Override
52 public String toString() {
53 return "Contact [id=" + id + ", name=" + name + ", age=" + age
54 + ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
55 }
56 }
把xml文档中的信息封装到对象中
1 package com.shore.test;
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.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12
13 /**
14 * @author DSHORE / 2018-8-29
15 *
16 */
17 //把xml文档中的信息封装到对象中
18 public class Demo3 {
19 public static void main(String[] args) throws DocumentException {
20 List<Contact> list=new ArrayList<Contact>();
21 //读取xml,封装对象
22 Document doc=new SAXReader().read(new File("./src/contact.xml"));
23 Iterator<Element> it=doc.getRootElement().elementIterator("contact");
24 while(it.hasNext()){
25 Element elt=it.next();
26 //创建
27 Contact contact=new Contact();
28 contact.setId(elt.attributeValue("id"));
29 contact.setName(elt.elementText("name"));
30 contact.setAge(elt.elementText("age"));
31 contact.setPhone(elt.elementText("phone"));
32 contact.setEmail(elt.elementText("email"));
33 contact.setQq(elt.elementText("qq"));
34 list.add(contact);
35 }
36 for (Contact contact : list) {
37 System.out.println(contact);
38 }
39 }
40 }
结果图

|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9550048.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
来源:https://www.cnblogs.com/dshore123/p/9550048.html