一.XML概述
- 起源:W3C万维网联盟,先定义出来的是HTML,XML推出的初衷是为了替换HTML(HTML语法过于松散,为了规范,推出了XML语言),后来,XML语言用作配置文件,封装数据,版本只有一个v1.0
- 概念:XML是一种可扩展标记语言,即标签可以自定义
- 命名规范:不能以数字开头,不能使用纯数字,区分大小写
- 功能:
- a.配置文件
- b.网络数据传输的载体
- 语法:新建一个文本文件,后缀名必须为
.xml
- 组成部分
- a.文档声明:
<?xml version="1.0" encoding="utf-8"?>
encoding
:告诉浏览器用什么编码去解析
文档声明必须在顶格 - b.根标签:有且仅有一个根标签
- c.其他标签:有开始标签,一定要有结束标签
- d.文本:CDATA区:该区域的文本,会按照纯文本解析
文本格式:<![CDATA[内容]]>
- a.文档声明:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="s001">
<name>张三</name>
<age>23</age>
<tel>123456</tel>
</student>
<student id="s002">
<name>李四</name>
<age>24</age>
<tel>134567</tel>
</student>
</students>
二.解析XML
DOM
- DOM(Document Object Model 文档对象模型):将文档的各个组成部分抽取一个对象
Element
:标签对象
Attribute
:属性对象
Text
:文本对象
Comment
:注释对象
Node
:节点对象
Doucment
:文档对象 - 解析过程:将文档一次性,加载进内存,然后将文档各个组成部分抽取为对象
- 优缺点:
- a.优点:能够对文档进行增删改查
- b.缺点:耗内存,适用pc端
SAX
- SAX:基于事件,逐行解析,一次读取一行,释放一行
- 优缺点:
- a.优点:不占内存,适用于移动端
- b.缺点:只能查,不能增删改
常用解析器
- DOM4J:第三方jar包,实现了DOM思想
- Pull解析器:第三方jar包,实现了SAX思想
三.DOM4J解析器
步骤
- 导入DOM4J的jar包
- 将xml文件,放入工程根目录
people.xml:
<?xml version="1.0" encoding="UTF-8"?>
<people>
<user id="001">
<name>张三</name>
<tel>123456</tel>
</user>
<user id="002">
<name>李四</name>
<tel>134567</tel>
</user>
<user id="00">
<name>王一</name>
<tel>1345674</tel>
</user>
</people>
获取标签对象
getRootElement()
:获取根标签对象element()
:获取根标签下的子标签,默认获取的是第一个子标签Elements()
:获取所有子标签对象elementesiterator()
:获取所有子标签对象
public class Demo1 {
public static void main(String[] args) throws Exception, Exception{
//创建解析器对象
SAXReader reader = new SAXReader();
//加载XML文件
Document doc = reader.read(new FileInputStream("people.xml"));
//getRootElement():获取根标签对象
Element rootEle= doc.getRootElement();
//element():获取根标签下的子标签,默认获取的是第一个子标签
Element userEle = rootEle.element("user");
//getName():得到子标签名称
System.out.println(userEle.getName());
//elements():获取所有子标签
List<Element> userEles = rootEle.elements();
for(Element ele:userEles){
System.out.println(ele.getName());
}
//elementesiterator():获取所有子标签对象
Iterator<Element> elementIterator = rootEle.elementIterator();
while (elementIterator.hasNext()) {
Element element = elementIterator.next();
System.out.println(element.getName());
}
}
}
获取属性对象和标签之间的文本
获取属性对象
attribute()
:获取单个属性对象attributes()
:获取所有属性对象attributeiterator()
:获取所有属性对象attributeValue()
:直接获取属性对象的值
public class Demo2{
public static void main(String[] args) throws Exception {
// 创建解析器对象
SAXReader reader = new SAXReader();
// 加载xml文件
Document doc = reader.read(new FileInputStream("people.xml"));
// 方式1:分布获取属性对象
// getRootElement():获取跟标签对象
Element rootElement = doc.getRootElement();
// element():获取属性对象
Element element = rootElement.element("user");
// attribute("id"):获取id属性
Attribute attribute = element.attribute("id");
// getValue():获取属性值
// getName():获取属性名
String value = attribute.getValue();
String name = attribute.getName();
System.out.println(name + "---" + value);
System.out.println("--------------------------");
// 方式2:attributeValue():直接获取属性值
String value2 = rootElement.element("user").attributeValue("id");
System.out.println(value2);
System.out.println("------------------");
// 方式3:attributes():获取所有属性对象
List<Attribute> attributes = rootElement.element("user").attributes();
for (Attribute attr : attributes) {
String name2 = attr.getName();
String value3 = attr.getValue();
System.out.println(name2 + "---" + value3);
}
System.out.println("------------------");
// attributeIterator():通过迭代器获取所有属性对象
Iterator<Attribute> attributeIterator = rootElement.element("student").attributeIterator();
while (attributeIterator.hasNext()) {
Attribute attribute2 = attributeIterator.next();
System.out.println(attribute2.getName() + "---" + attribute2.getValue());
}
}
}
获取标签之间的文本
getText()
:拿出文本elementText("name")
:拿出该标签中的文本
public class Demo2{
public static void main(String[] args) throws Exception {
// 创建解析器对象
SAXReader reader = new SAXReader();
// 加载xml文件
Document doc = reader.read(new FileInputStream("people.xml"));
// 方式1:层层往下拿
String text1 = doc.getRootElement().element("user").element("tel").getText();
System.out.println(text1);
// 方式2:一步到位
String text2 = doc.getRootElement().element("user").elementText("tel");
System.out.println(text2);
}
}
获取所有节点
node()
:获取单个节点对象
nodeiterator()
:获取多个节点对象,只能获取子结点