1. 认识XML
1.1. 什么是XML
XML:可扩展标记语言(Extensible Markup Language)
使用简单的标记来描述数据。
XML是一种非常灵活的语言,没有固定的标签,所有标签都可以自定义。
通常,XML被用于信息的记录和传递。因此,XML通常被用来充当配置文件。
1.2. XML的格式
1、声明信息,用于描述XML的版本和编码方式。
<?xml version="1.0" encoding="UTF-8"?>
2、XML有且只有一个根元素。
3、XML是大小写敏感的。
4、标签是成对出现的,并且要正确嵌套。
5、属性值要用双引号包含起来。
6、注释要用<!-- -->包含起来。
示例:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="book01">
<name>java初级编程</name>
<author>张三</author>
<price>20</price>
</book>
<book id="book02">
<name>java中级编程</name>
<author>李四</author>
<price>30</price>
</book>
</books>
2. 认识DTD
2.1. 什么是DTD
DTD:文档类型定义(Document Type Definition)
DTD用来约束XML的文档格式,保证XML是一个有效的XML。
DTD可以分为两种:内部DTD、外部DTD。
2.2. 使用DTD
2.2.1. 内部DTD
-
内部DTD的定义
假如DTD被包含在XML源文件中,他应该通过下面的语法包装在一个DOCTYPE的声明中。
声明如下:
<!DOCTYPE 根元素 [元素声明]>
-
元素声明语法
<!ELEMENT 元素名 (子元素[,子元素...])>
-
数量词
“+”:表示出现一次或多次。
“?”:出现0次或一次
“*”:表示出现任意次 -
属性声明语法
<!ATTLIST 元素名称 属性名称 属性类型 属性值>
属性类型:CDATA,表示字符数据(character data)
默认值:#REQUIRED,表示必须出现;#IMPLIED,表示不是必须的。
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD -->
<!DOCTYPE scores [
<!ELEMENT scores (student+)>
<!ELEMENT student(name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (PCDATA)>
<!ELEMENT course (PCDATA)>
<!ELEMENT score (PCDATA)>
]>
<scores>
<student id="1">
<name>张三</name>
<course>Java</course>
<score>90</score>
</student>
<student id="2">
<name>李四</name>
<course>C语言</course>
<score>80</score>
</student>
</scores>
2.2.2. 外部DTD
- 创建一个独立的DTD文件
<!-- scores.dtd文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student(name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (PCDATA)>
<!ELEMENT course (PCDATA)>
<!ELEMENT score (PCDATA)>
- 在XML中引入外部DTD文件
格式:<!ENTITY 实体名称 SYSTEM "URI/URL">
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD -->
<!ENTITY scores SYSTEM "scores.dtd">
<scores>
<student id="1">
<name>张三</name>
<course>Java</course>
<score>90</score>
</student>
<student id="2">
<name>李四</name>
<course>C语言</course>
<score>80</score>
</student>
</scores>
3. 认识XSD
3.1. 什么是XSD
XSD:XML Schema是DTD的替代者。
不仅可以定义XML文档的结构,还可以规范文档的内容。
XSD本身也是XML文档。
XSD采用XML来定义语法约束,比DTD要复杂一些,但是功能强大的多。
- 支持丰富的数据类型
- 允许开发者自定义数据类型
- 可读性强
- 可针对未来需求进行扩展
4. XML的解析
4.1. 常见的XML的解析技术
- DOM解析
是官方提供的解析方式,基于xml树解析,比较耗资源,适用于多次访问XML。 - SAX解析
是民间解析方式,基于事件解析,消耗资源小,适用于数据量较大的XML。 - JDOM解析
第三方提供,开源免费的解析方式,比DOM快。JDOM仅使用具体类而不使用接口。 - DOM4J解析
第三方提供,开源免费,非常优秀的java XML API,性能优异,功能强大,使用接口而不使用实现类。是JDOM的升级版。
4.2. DOM4J解析XML
解析XML的入口是需要先拿到一个Document对象
步骤:
首先导包
- 创建SAXReader对象,用于读取XML
SAXReader saxReader = new SAXReader();
- 读取XML文件,得到document对象,这个documen对象就代表XML文件
Document document = saxReader.read(new File("fileName"));
- 获取根元素
Element rootElement = document.getRootElement();
- 获取根元素下的所有子元素
可以通过元素迭代器迭代,遍历子元素
可以先获得某个元素的所有子元素Iterator<Element> elementIterator = rootElement.elementIterator(); while(elementIterator.hasNext()){ //取出根元素下的子元素 Element book = elementIterator.next(); //获取ID属性(若有多个属性,可以使用属性迭代器attributeIterator) Attribute id = element.attribute("id"); // 获取student的子元素 Element name = book.element("name"); Element author = book.element("author"); Element price = book.element("author"); }
// 得到某元素下的所有子元素,生成一个集合 List<Element> element = rootElement.elements(); for(Element ele : element){ // 获取当前节点下名为name子元素的文本值 String name = ele.elementText("name"); String author = ele.elementText("author"); String price = ele.elementText("price"); }
4.3. 生成XML
- 通过DocumentHelper生成一个Document对象
Document document = DocumentHelper.createDocument();
- 添加并得到根元素
// 不但创建了根元素,还得到了一个books根元素 Element books = document.addElement("books");
- 为根元素添加子元素,还可以得到子元素
// 不但创建了一个book元素,还得到了一个book元素 Element book = books.addElement("book");
- 为book元素添加属性,还可以得到一个元素
book.addAttribute("id","01"); // 截止到此处,可以将上边四句合为一句 DocumentHelper.createDocument.addElement("books").addElement("book").addAttribute("id","01");
- 为book添加子元素
Element name = book.addElement("name"); Element author = book.addElement("author"); Element price = book.addElement("price");
- 为子元素添加文本信息
name.addText("Java基础教程"); author.addText("张三"); price.addText("20");
- 将document输出到XML文件中即可 (输出无格式)
将document输出到XML文件中即可 (格式良好)Writer writer = new FileWriter(new File("src/book.xml")); document.write(writer);
OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("src/book.xml")) , format); writer.write(document);
- 关闭资源
writer.close();