XML是什么?
XML的全称是EXtensible Markup Language (可扩展标记语言)。
编写XML就是编写标签,与HTML非常类似,扩展名为.xml
如:
// demo.xml
<employee>
<name>李思</name>
<age>18</age>
<height>170</height>
</employee>
XML VS HTML
- 二者非常相似,都是编写标签。
- XML没有预定义标签,HTML存在大量的预定义标签。
- XML重在保存和传输数据,而HTML用于显示信息。
XML的用途
- 配置文件。
- 保存程序产生的数据。
- 网络间的数据传输。
XML文档结构
- 第一行必须是XML声明。
- 有且只有一个根节点。
- XML标签的书写规则与HTML相同。
XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0" encoding="utf-8"?>
<!-- 注释的写法 -->
<company>
<employee>
<name no="210">李思</name>
<age>18</age>
<department>
<dname>研发部</dname>
<address>西溪八方城</address>
</department>
</employee>
<employee>
<name no="210">王五</name>
<age>20</age>
<department>
<dname>设计部</dname>
<address>阿里事业部</address>
</department>
</employee>
</company>
在浏览器中可打开查看:
XML声明
XML标签书写规则
-
合法的标签名
标签名要有意义。
建议使用英文,小写字母,单词之间使用-分割
建议多级标签之间不要存在重名的情况。
-
适当的注释与缩进
可以让XML更容易阅读。
-
合理使用属性
标签属性用于描述标签不可或缺的信息。
对标签分组或者为标签设置id时常用属性表示。
-
特殊字符与CDATA标签
标签体中,出现 < >这样的字符,会破坏文档结构。
解决方法1:使用实体引用
适合特殊符号比较少的情况。
解决方法2:使用CDATA标签
CDATA指的是不应由XML解析器进行解析的文本数据。
从 <![CDATA[ 开始,到 ]]> 结束
使用CDATA标签
-
有序的子元素
在XML多层嵌套的子元素中,标签前后顺序应保持一致。
XML语义约束
XML文档结构正确,但可能不是有效的。
例如:员工档案XML中绝不允许出现“植物品种”标签。XML语义约束就是用于规定XML文档中允许出现哪些元素。
XML语义约束有两种定义方式:DTD与XML Schema。
DTD( Document Type Definition)
DTD(文档类型定义)是一种简单易用的语义约束方式。
DTD文件的扩展名为.dtd
1、 DTD定义节点
利用DTD中的<!ELEMENT>标签,我们可以定义XML中允许出现的节点及数量,以hr.xml为例:
DTD定义节点数量
如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
XML引用DTD文件
在XML文件中使用<!DOCTYPE>标签来引用DTD文件。
创建DTD文件
hr.dtd文件
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT company (employee+)>
<!ELEMENT employee (name,age,department) >
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ATTLIST name no CDATA "">
hr.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE company SYSTEM "hr.dtd">
<!-- 注释的写法 -->
<company>
<employee>
<name no="210">李思</name>
<age>18</age>
<department>
<dname>研发部</dname>
<address>西溪八方城</address>
</department>
</employee>
<employee>
<name no="210">王五</name>
<age>20</age>
<department>
<dname>设计部</dname>
<address>阿里事业部</address>
</department>
</employee>
</company>
2、 XML Schema
- XML Schema比DTD更复杂,提供了更多功能。
- XML Schema提供了数据雷类型、格式限定、数据范围等特效。
- XML Schema是W3C标准。
DOM文档对象模型
DOM (Document Object Model) 定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。
Dom4j
- Dom4j是一个用于解析XML的库,应用于java平台,具有性能优异、功能强大和易使用的特点
- Dom4j将XML视为Document对象。
- XML标签将Dom4j定义为Element对象。
1、Dom4j遍历XML
1.1 下载Dom4j的jar包
1.2 将jar包添加到工程
1.3 创建测试类 HrReader.java
package dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class HrReader {
public void readXml() {
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(file);
// 获取XML文档节点的根节点
Element root = doc.getRootElement();
List<Element> employees = root.elements("employee");
for (Element employee :employees) {
Element name = employee.element("name");
String empName = name.getText();// getText()方法用于获取标签文本
System.out.println(empName);
System.out.println(employee.elementText("age"));
// System.out.println(employee.elementText("salary"));
Element department = employee.element("department");
System.out.println(department.element("dname").getText());
System.out.println(department.element("address").getText());
Attribute att = name.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
2、利用Dom4j更新XML
创建HRWriter.java
package dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class HrReader {
public void readXml() {
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(file);
// 获取XML文档节点的根节点
Element root = doc.getRootElement();
List<Element> employees = root.elements("employee");
for (Element employee :employees) {
Element name = employee.element("name");
String empName = name.getText();// getText()方法用于获取标签文本
System.out.println(empName);
System.out.println(employee.elementText("age"));
// System.out.println(employee.elementText("salary"));
Element department = employee.element("department");
System.out.println(department.element("dname").getText());
System.out.println(department.element("address").getText());
Attribute att = name.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
XPath路径表达式
- XPath路径表达式时XML文档中查找数据的语言。
- XPath可以极大的提高在提取数据时的开发效率。
- XPath本质就是掌握各种形式表达式的使用技巧。
1、XPath基本表达式
XPath常用的基本表达式
XPath基本表达式案例
2、XPath谓语表达式
Jaxen
- Jaxen是一个java编写的XPath库。这是适应多种不同的对象模型,包括DOM、XOM、dom4j、JDOM。
- Dom4j底层依赖Jaxen实现XPath查询
- Jaxen下载地址 : 下载
测试XPath
XPathTest .java
package dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class XPathTest {
public void xpath(String xpathExp){
String file = "D:\\study\\player\\src\\hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
List<Node> nodes = document.selectNodes(xpathExp);
for (Node node :nodes){
Element ele = (Element) node;
System.out.println(ele.elementText("name"));
System.out.println(ele.elementText("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTest test = new XPathTest();
// test.xpath("/company/employee");
// test.xpath("//employee");
// test.xpath("//employee[age<20]");
// test.xpath("//employee[name='李思']");
// test.xpath("//employee[1]");
test.xpath("//employee[last()]");
}
}