一、基础
1、介绍
1)概念
xml,即Extensible Markup Language,可扩展标记语言。
可扩展:标签都是自定义。
标记语言:由标签构成的语言。
2)功能
存储数据。
a、配置文件。
b、网络中传输。
3)xml与html的区别
a、xml标签都是自定义的,html标签是预定义的。
b、xml语法严格,html语法松散。
c、xml用于存储数据,html用于展示数据。
2、语法
1)基础语法
a、后缀名.xml。
b、xml文件第一行必须定义文档声明。<?xml version="1.0" encoding="UTF-8" ?>
c、xml文档有且仅有一个根标签。
d、属性值必须使用单引号或双引号。<user id="1"></user>
e、xml标签名区分大小写.
f、标签中有内容需要使用<标签名>内容</标签名>,无则使用闭合标签<标签名/>.
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<myroot>
<user id="1">
<name>小李</name>
<group name="group_1"/>
</user>
</myroot>
结果:
错误示例:
(文档声明没有放置第一行)
<?xml version="1.0" encoding="UTF-8" ?>
<myroot>
<user id="1">
<name>小李</name>
<group name="group_1"/>
</user>
</myroot>
结果:
补充:
可以直接将xml文件拖入浏览器。
2)组成部分
a、文档声明
——格式:<?xml 属性列表 ?>
——属性列表:version-版本号(必须),encoding-编码方式(默认值:ISO-8859-1),standalone-是否独立(yes:不依赖其它文件,no:依赖其它文件)
b、指令(了解)
——导入css样式,<?xml-stylesheet type="text/css" href="xxx.css" ?>
c、标签
d、属性
e、文本
——CDATA区,该区域的数据原样展示。格式:<![CDATA[内容]]>
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="test.css" ?>
<root>
<user>
<name>小李</name>
<code>
<![CDATA[
<name></name>
]]>
</code>
</user>
</root>
name {
color: #0066FF;
}
结果:
二、约束
1、介绍
约束即规定xml文档的书写规则。例如:程序员编写xml文档中有标签<background-color>blue</background-color>
,但是框架不能识别它的含义,因此需要约束文档。
2、DTD约束(了解)
DTD是一种简单的约束技术。
使用方法:
1)内部DTD(不推荐),即约束规则定义在xml文件中。
示例:
test.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--<!DOCTYPE People SYSTEM "people.dtd" >-->
<!DOCTYPE People [
<!ELEMENT People (people*) > <!--People:根标签;people*表示people标签数大于等于0-->
<!ELEMENT people (name,age) > <!--name、age表示people标签的属性-->
<!ELEMENT name (#PCDATA) > <!--属性类型-->
<!ELEMENT age (#PCDATA) >
] >
<People>
<people>
<name>小白</name>
<age>18</age>
</people>
<people>
<name>小红</name>
<age>19</age>
</people>
</People>
2)外部DTD,即约束规则定义在外部dtd文件中。
a、本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件路径">
b、网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件路径">
本地外部DTD示例:
people.dtd
<!ELEMENT People (people*) > <!--People:根标签;people*表示people标签数大于等于0-->
<!ELEMENT people (name,age) > <!--name、age表示people中的标签,必须按顺序使用-->
<!ELEMENT name (#PCDATA) > <!--类型-->
<!ELEMENT age (#PCDATA) >
test.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE People SYSTEM "people.dtd" >
<People>
<people>
<name>小白</name>
<age>18</age>
</people>
<people>
<name>小红</name>
<age>19</age>
</people>
</People>
如果xml文档没有按照dtd的规定书写标签,会导致报错。
缺点:
无法对标签内容进行约束。
3、Schema约束(了解)
Schema是一种复杂的约束技术。相比DTD,能够对标签内容进行约束。
引入格式:
<根标签
xmlns:xsi(xsi前缀)
xsi:schemaLocation(xsd文件命名空间)
xmlns(为xsd约束声明一个前缀作为标识)>
</根标签>
示例:
student.xsd
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.test.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.test.cn/xml" elementFormDefault="qualified">
<!--自定义元素,name:标签名,type:类型-->
<xsd:element name="students" type="studentsType"/>
<!--自定义组合类型,name:类型名-->
<xsd:complexType name="studentsType">
<!--按顺序-->
<xsd:sequence>
<!--自定义元素,minOccurs:最少出现次数,maxOccurs:最多出现次数,unbounded:未绑定-->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--自定义组合类型,name:类型名-->
<xsd:complexType name="studentType">
<!--按顺序-->
<xsd:sequence>
<!--自定义元素,name:标签名,type:类型,xsd:string:字符串类型-->
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<!--自定义属性,use="required":必须使用-->
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!--自定义简单类型,name:类型名-->
<xsd:simpleType name="sexType">
<!--约束数据格式,base:基本数据格式-->
<xsd:restriction base="xsd:string">
<!--枚举类型-->
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<!--自定义简单类型,name:类型名-->
<xsd:simpleType name="ageType">
<!--约束数据格式,base:基本数据格式-->
<xsd:restriction base="xsd:integer">
<!--自定义最小值和最大值-->
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="128"/>
</xsd:restriction>
</xsd:simpleType>
<!--自定义类型,name:类型名-->
<xsd:simpleType name="numberType">
<!--约束数据格式,base:基本数据格式-->
<xsd:restriction base="xsd:string">
<!--自定义格式-->
<xsd:pattern value="number_\d{2}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.test.cn/xml student.xsd"
xmlns="http://www.test.cn/xml"
>
<student number="number_01">
<name>小白</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
如果引入多个xsd文件,可能会导致标签重复,因此可以通过前缀区分。
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.test.cn/xml student.xsd
http://www.test2.cn/xml student2.xsd
"
xmlns:a="http://www.test.cn/xml"
xmlns:b="http://www.test2.cn/xml"
>
<a:student number="number_01">
<a:name>小白</a:name>
<a:age>18</a:age>
<a:sex>male</a:sex>
</a:student>
</students>
三、解析
1、解析方式
1)DOM解析
DOM即文档对象模型(Doucment Object Model),将标记语言文档一次性加载进内存,形成DOM树。
优点:
操作方便,可对文档进行CRUD。
缺点:
消耗内存,DOM树占用可能是原文档的很多倍。(一般用于服务端)
2)SAX解析
基于事件驱动,逐行读取。如:<title>内容</title>
会分成三行读取,并且读取一行释放一行,即内存中只有一行数据,其中两个标签的对应由事件驱动处理。
优点:
内存占用极低。(一般用于手机端)
缺点:
只能读取,不能CRUD。
2、常用解析器介绍
1)JAXP(不推荐)
官方提供的解析器,效率低。支持DOM、SAX。
2)DOM4J
性能优异、功能强大和极其易使用。支持DOM、SAX。
3)Jsoup
Java的html解析器,可直接解析url地址、html文本。支持DOM、SAX。
4)PULL
Android操作系统内置的解析器,使用SAX方式解析。
3、Jsoup解析器
链接: https://pan.baidu.com/s/1lExrICbo8_1WmhRTHNri1g
提取码:065o
简单使用
1、获取xml路径 类.class.getClassLoader().getResource("xxx.xml").getPath()
2、解析xml Jsoup.parse(new File(path),"xml的编码格式")
3、获取元素对象 document.getXXX("xxx")
主要方法
Jsoup.parse():解析xml
——parse(File,编码)
——parse(URL,超时时间)
——parse(字符串,编码)
示例:
test.xml
<?xml version="1.0" encoding="UTF-8" ?>
<People>
<people id="0">
<name>小白</name>
<age>18</age>
</people>
<people id="1">
<name>小红</name>
<age>19</age>
</people>
</People>
test.java
package xml_learn.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
public class test {
public static void main(String[] args) throws Exception {
//获取xml文件路径
String path = test.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
//解析xml,加载文件进内存,获取DOM树
Document document = Jsoup.parse(new File(path),"utf-8");
//获取元素对象,返回数组
Elements elements = document.getElementsByTag("name");
for (Element el : elements) {
System.out.println(el.text());
}
}
}
输出:
小白
小红
示例:
package xml_learn.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URL;
public class test {
public static void main(String[] args) throws Exception {
URL url = new URL("https://baidu.com");
Document document = Jsoup.parse(url, 10000);
System.out.println(document);
}
}
输出:
略
对象
a、Document:文档对象
b、Element:元素对象
c、Node:节点对象(Document和Element的父类)
快捷查询
a、Selector选择器
示例:
package xml_learn.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
public class test2 {
public static void main(String[] args) throws Exception {
String path = test2.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
Elements elements = document.select("people[id=0] name");
System.out.println(elements.text());
}
}
输出:
小白
b、XPath
XPath即XML路径语言,用于确定XML文档中的位置。
链接:https://pan.baidu.com/s/1IiddSMkM77nCl5BepU5DMQ
提取码:5xq7
示例:
package xml_learn.jsoup;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.util.List;
public class test2 {
public static void main(String[] args) throws Exception {
String path = test2.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
JXDocument jxDocument = new JXDocument(document);
List<JXNode> jxNodes = jxDocument.selN("//people[@id=0]/name");
for (JXNode jxNode:jxNodes) {
System.out.println(jxNode.getElement().text());
}
}
}
输出:
小白
4、DOM4J解析器
链接:https://pan.baidu.com/s/12SaGh5fglhIhbuO-rO0kYg
提取码:1s7c
主要方法
saxReader.read(new File(path)):解析xml
document.getXXX():获取元素
示例:
package xml_learn.dom4j;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class test {
public static void main(String[] args) throws Exception{
String path = test.class.getResource("test.xml").getPath();
//读取文件
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(path));
//获取根节点
Element rootElement = document.getRootElement();
//获取元素
List name = rootElement.elements("people");
Element el;
for (Object obj : name) {
el = (Element) obj;
//获取子元素文本
System.out.println(el.element("name").getText());
}
}
}
输出:
小白
小红
其它方法
DocumentHelper.createDocument():创建文档
DocumentHelper.createElement():创建元素
document.addDocType(doc1,doc2,…):创建文档DocType
element.addXXX:添加元素、注释、属性等
输出格式化文档
OutputForamt format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(输出流,format);
writer.write(document);