XML入门

XML的概念与用途

XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

XML与HTML的比较
1.XML与HTML非常相似,都是编写标签
2.XML没有预定义标签,HTML存在大量预定义标签
3.XML重在保存和传输数据,HTML用于显示信息

XML的用途
1.java程序的配置描述文件
2.用于保存程序产生的数据
3.网络间的数据传输

XML文档结构

第一行必须是XML声明。
有且只有一个根节点。
XML标签的书写规则与HTML相同。

XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version=“1.0”encoding=“UTF-8”?>

第一个XML程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr>
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>财务部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>31</age>
<salary>3000</salary>
<department>
<dname>工程部</dname>
<address>XX大厦-B104</address>
</department>
</employee>
</hr>

XML标签书写规则

1
2
3
4
5
6
7
8
9
10
11
12
标签名使用小写英文, 单词间用-分隔
多级标签之间不要存在重名

对特殊符号使用实体引用或CDATA标签
5种实体引用
&lt; <
&gt; >
&amp; &
&apos; '
&quot; "
CDATA标签:
<![CDATA[不希望由XML解析的文本数据]]>

XML语义约束之DTD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、XML文档结构正确,但可能不是有效的;
例如:员工档案XML中绝不允许出现“植物品种”标签。
XML语义约束就是用于规定XML文档中允许出现那些元素;
2、XML语义约束有两种定义方式:DTD与XML Schema;
DTD:DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方法;
DTD文件的扩展名为:.dtd;
例如:hr.dtd
<!ELEMENT hr(employee+)> //大于1个 :定义了hr节点下只允许出现1个employee子节点。
<!ELEMENT employee(name,age,salary,department)>
//employee节点下必须包含以下四个节点,且按顺序出现
<!ATTLIST employee no CDATA "">
<!ELEMENT name(#PCDATA)> // 定义name标签体只能是文本,#PCDATA代表文本元素;
3、DTD定义节点数量:
1)如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符;
如:
<!ELEMENT hr(employee+)> //hr节点下最少出现1个employee子节点;
<!ELEMENT hr(employee*)> //hr节点下可出现 0 或 n 个employee子节点;
<!ELEMENT hr(employee?)> //hr节点下最多出现1个employee子节点;
4、XML引用DTD文件:
1)在XML中使用<!DOCTYPE>标签引用DTD文件。 SYSTEM 加载本地文件;
书写格式:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
例如:
<!DOCTYPE hr SYSTEM "hr.dtd">

创建DTD文件

1
2
<!ELEMENT employee (name,age,salary,department):一定要注意employee ()之间有个空格,否则不生效。
<!ATTLIST employee no CDATA "">:来控制标签属性

XML Schema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
XML Schema
比DTD更复杂
XML Schema提供了数据类型、格式限定、数据范围等特性
<schema xmlns="http://www.w3.org/2001/XMLSchema">
声明文本是Schema
<element>代表标签节点
<complexType>复杂节点, 标签包含子节点时使用
<sequence>子标签按顺序排列
<attribute>设置属性
标签属性:
name= 属性名称
type= 属性值类型
use="required" 属性必须存在
minOccurs="" 最小出现次数
maxOccurs="" 最大出现次数
<simpleType>简单类型。 代替属性:type使用
<restriction>限定数据类型
base=""基本类型
<minInclusive value="">最小数据范围
<maxInclusive value="">最大数据范围
在XML文本的根节点添加xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schema文件路径" 属性来关联schema文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
<complexType>
<sequence>
<element name="employee" minOccurs="1" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age">
<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>

DOM模型与Dom4j

1.将xml文件视为Document对象
2.将xml文件中的标签视为Element对象

Dom4j遍历XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.imooc.dom4j;

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;

public class HrReader {
public void readXml(){
String file = "d:/workspace/xml/src/hr.xml";
//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中。
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
//获取XML文档的根节点,即hr标签
Element root = document.getRootElement();
//elements方法用于获取指定的标签集合
List<Element> employees = root.elements("employee");
for(Element employee : employees){
//element方法用于获取唯一的子节点对象
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 = employee.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}

}

Dom4j更新XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.imooc.dom4j;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HrWriter {
public void writeXml(){
String file = "d:/workspace/xml/src/hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
Element root = document.getRootElement();
Element employee = root.addElement("employee");
employee.addAttribute("no", "3311");
Element name = employee.addElement("name");
name.setText("李铁柱");
employee.addElement("age").setText("37");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("XX大厦-B105");
Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8");
document.write(writer);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
HrWriter hrWriter = new HrWriter();
hrWriter.writeXml();
}
}

XPath表达式入门

-------------本文结束感谢您的阅读-------------