本文知识点(目录):本文下面的“实例及附录”全是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文档的内容.

缺点:内存消耗大
    优点:文档增删改查比较容易

java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP

4.2、SAX解析的原理

从上往下读,读一行处理一行。      DOM与SAX解析的区别         SAX解析原理

优点:内存消耗小,适合读
    缺点:不适合增删改

5、实例

例1:

 package com.bw.test;

 import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader; public class Demo1 {
/*
* 第一个Dom4j读取xml文档的例子
*
* */
public static void main(String[] args) {
try {
//1.创建一个xml解析器对象
SAXReader reader = new SAXReader();
//2.读取xml文档,返回Document对象
Document doc= reader.read("./src/contact.xml");
System.out.println(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

contact.xml文件

 <?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>[email protected]</email>
<qq>872855221</qq>
<abc>
<a><b></b></a>
</abc>
</contact>
<contact id="038">
<name>李四</name>
<age>20</age>
<phone>1314580</phone>
<email>[email protected]</email>
<qq>832144529</qq>
</contact>
</contactList>

例2:

 package com.shore.test;

 import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test; /**
* @author DSHORE / 2018-8-29
*
*/
public class Demo1 {
@Test
public void test1() throws DocumentException{
//1.读取xml文档,返回一个document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
Iterator<Node> it=doc.nodeIterator();
while(it.hasNext()){//判断是否有下一位元素
Node node=it.next();
System.out.println(node.getName());
//继续获取下面的子节点
//只有标签有子节点
//判断当前节点是否为标签节点
if(node instanceof Element){
Element elem=(Element)node;
Iterator<Node> it2=elem.nodeIterator();
while(it2.hasNext()){
Node n2=it2.next();
System.out.println(n2.getName());
}
}
}
}
}

实例结果图

java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP

附录1

 package com.shore.test;

 import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test; /**
* @author DSHORE / 2018-8-29
*
*/
/*
* 第二个dom4j读取的xml文件内容
* 节点
* 标签
* 属性
* 文本
* */
public class Demo1 {
@Test
public void test1() throws DocumentException{
//1.读取xml文档,返回一个document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
Iterator<Node> it=doc.nodeIterator();
while(it.hasNext()){//判断是否有下一位元素
Node node=it.next();
System.out.println(node.getName());
//继续获取下面的子节点
//只有标签有子节点
//判断当前节点是否为标签节点
if(node instanceof Element){
Element elem=(Element)node;
Iterator<Node> it2=elem.nodeIterator();
while(it2.hasNext()){
Node n2=it2.next();
System.out.println(n2.getName());
}
}
}
}
/*
* 遍历xml文件的所有节点
* */
@Test
public void test2() throws DocumentException{
//1.读取xml文档获取Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//得到跟标签
Element rootEls=doc.getRootElement();
getChildNodes(rootEls);
}
/*
* 获取传入标签下的所有子标签
* */
private void getChildNodes(Element rootEls) {
if(rootEls instanceof Element){
System.out.println(rootEls.getName());
}
//得到子节点
Iterator<Node> it=rootEls.nodeIterator();
while(it.hasNext()){
Node node=it.next();
//判断是否是标签节点
if(node instanceof Element){
Element el=(Element)node;
//递归
getChildNodes(el);
}
}
}
/*
* 获取标签
* */
@Test
public void test3() throws DocumentException{
//1.读取xml文档,返回Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//得到跟标签
Element elt=doc.getRootElement();
//得到标签名称
String name=elt.getName();
System.out.println(name);//返回值:contactList //方法1:得到当前标签下指定的名称的第一个子标签
Element contactElem=elt.element("contact");
String name1=contactElem.getName();
System.out.println(name1);//返回值:contact //方法2:得到当前根标签下的所有下一级子标签
List<Element> list=elt.elements();
//遍历list
//1).传统的for循环 2).增强for循环 3).迭代器
for(int i=0;i<list.size();i++){
Element e=list.get(i);
System.out.println(e.getName());//返回值:contact 注意:这里的返回值是有两个contact,因为contact.xml文件中有两个根标签的下一级标签contact(两个contact是同一级)
}
for (Element e : list) {//增强for循环
System.out.println(e.getName());//返回值:contact 同上
}
Iterator<Element> it=list.iterator();
while(it.hasNext()){//迭代器
Element e=it.next();
System.out.println(e.getName());//返回值:contact 同上
} //方法3:获取更深层次标签(方法只能一层层地获取)
Element element=doc.getRootElement().element("contact").element("name");
System.out.println(element.getName());//返回值:name
}
/*
* 获取属性值
* */
@Test
public void test4() throws DocumentException{
//1.读取xml文档,返回一个Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//获取属性(先获取标签对象,然后在获取属性)
//获得标签对象
Element contactElt=doc.getRootElement().element("contact");
//获取属性,得到指定名称属性值
String idValue=contactElt.attributeValue("id");
System.out.println(idValue);//返回值:001
//得到指定属性名称的属性对象
Attribute idAttr=contactElt.attribute("id");
//getName()属性名 getValue属性值
System.out.println(idAttr.getName()+"/"+idAttr.getValue());//返回值:id/001
}
}

结果图

java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP      java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP      java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP

注:test3()的结果,看代码中的注释

附录2

 package com.shore.test;

 import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* @author DSHORE / 2018-8-29
*
*/ public class Demo2 {
/*
* 获取属性
* */
@Test
public void test() throws DocumentException{
//1.解析xml文档,返回一个document对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
//获取属性:(先获取属性所在标签对象,然后才能获取属性值)
//2.得到标签
Element elt=doc.getRootElement().element("contact");
//3.得到属性
//得到指定名称的属性值
String idValue=elt.attributeValue("id");
System.out.println(idValue);//返回值:001
//得到指定名称的属性对象
Attribute aib=elt.attribute("id");
//getName() 属性名称 getValue()属性值
System.out.println("属性名称:"+aib.getName()+"/"+"属性值:"+aib.getValue());//返回值:属性名称:id/属性值:001 //方式1:得到所有属性对象,返回一个list()
List<Attribute> list=elt.attributes();
for (Attribute attr: list) {
System.out.println(attr.getName());//返回值:id/001 sex/男
} //方式2:得到所有属性对象,返回一个迭代器
Iterator<Attribute> attr2=elt.attributeIterator();
while(attr2.hasNext()){
Attribute a=attr2.next();
System.out.println(a.getName()+"/"+a.getValue());//返回值:id/001 sex/男
}
}
/*
* 获取文本内容
* */
@Test
public void test2() throws DocumentException{
//1.解析xml文档,返回一个document对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
/*
* 注意:空格和换行也是xml的内容
* */
String content=doc.getRootElement().getText();
//获取文本内容(先获取标签,在获取标签上的内容)
Element elt=doc.getRootElement().element("contact").element("name");
//方式1:得到文本内容
String test=elt.getText();
System.out.println(test);//返回值:张三 //方式2:得到指定标签的文本内容
String test2=doc.getRootElement().element("contact").elementText("phone");
System.out.println(test2); //返回值:15779593710
}
}

附录3

contact.xml文件

 <?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>[email protected]</email>
<qq>872855221</qq>
<abc>
<a> </a>
</abc>
</contact>
<contact id="038">
<name>李四</name>
<age>20</age>
<phone>1314580</phone>
<email>[email protected]</email>
<qq>832144529</qq>
</contact>
</contactList>

Contact实体(模型)

 package com.shore.test;

 /**
* @author DSHORE / 2018-8-29
*
*/
public class Contact {
private String id;
private String name;
private String age;
private String phone;
private String email;
private String qq; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", age=" + age
+ ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
}
}

把xml文档中的信息封装到对象中

 package com.shore.test;

 import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /**
* @author DSHORE / 2018-8-29
*
*/
//把xml文档中的信息封装到对象中
public class Demo3 {
public static void main(String[] args) throws DocumentException {
List<Contact> list=new ArrayList<Contact>();
//读取xml,封装对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
Iterator<Element> it=doc.getRootElement().elementIterator("contact");
while(it.hasNext()){
Element elt=it.next();
//创建
Contact contact=new Contact();
contact.setId(elt.attributeValue("id"));
contact.setName(elt.elementText("name"));
contact.setAge(elt.elementText("age"));
contact.setPhone(elt.elementText("phone"));
contact.setEmail(elt.elementText("email"));
contact.setQq(elt.elementText("qq"));
list.add(contact);
}
for (Contact contact : list) {
System.out.println(contact);
}
}
}

结果图

java基础71  XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)-LMLPHP

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/9550048.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

04-16 17:32