XML基础学习
@author:HB、ocean
@time:2020-3-20
1.XML简介
-
xml,eXtensible Markup Language,可扩展标记语言+
-
灵活 可自定义标签
-
用于消息记录和传递,充当配置文件(存储数据 数据交换 配置文件)
格式
- 声明信息,描述版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
- xml有且只有一个根元素
- 大小写敏感
- 标签成对出现,正确嵌套
- 属性值使用双引号
- 注释写法
<!-- 这是注释 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是注释 -->
<books>
<book id="b01">
<name>Java语言</name>
<author>田一百五十六</author>
<price>156</price>
</book>
<book id="b02">
<name>田语言</name>
<author>李四</author>
<price>4</price>
</book>
</books>
-
有效的xml文档
- 格式良好
- 使用DTD和XSD(XML Schema)定义语义约束
2.DTD
-
DTD,Document Type Defination 文档类型定义
-
DTD用于约束xml文档格式。保证xml是一个有效的xml
-
使用DTD生成模板,快速书写
-
DTD分为两种,内部DTD,外部DTD
内部DTD
<!-- <!DOCTYPE 根元素 [元素声明]> -->
-
元素声明语法
-
数量词
- +:表示出现1次或多次 至少一次
- ?:表示出现0次或1次
- *:表示出现任意次
-
属性声明语法
-
属性类型:CDATA(字符数据类型 character data)(只有CDATA不被解析)
-
默认值:
-
#REQUIRED,表示必须出现
-
#IMPLIED,表示不是必须的
-
-
-
PCDATA 指的是被解析的字符数据(Parsed Character Data)(不能含有元素)。
-
完整xml
<?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>156</score> </student> <student id="2"> <name>李四</name> <course>田语言</course> <score>58</score> </student> </scores>
外部DTD
+ 创建一个独立的DTD文件(与内部DTD语法一样 (除!DOCTYPE 根元素声明不加入) )
```xml
<?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文件
```xml
<!-- 引入外部DTD文件 -->
<!DOCTYPE scores SYSTEM "scores.dtd">
```
约束和验证XSD
- DTD升级版 可以规范文档内容
3.XML解析
- 对xml文件操作,创建、增删改查
常见xml解析技术
-
DOM解析
官方提供解析方式 基于xml树 消耗资源大
-
SAX解析
民间解析方式,基于事件的解析 消耗资源小
-
JDOM解析
第三方提供、开源、免费、比DOM解析快(使用实现类)
-
DOM4J -->DOM for JAVA
第三放提供、开源、免费、JDOM升级版 (使用接口)
DOM4J解析xml
解析xml文件入口,拿到一个Document对象
-
读取xml中文件的信息
package com.hb.dom4j; import java.io.File; import java.util.Iterator; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class TestXML { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub // [1]创建SAXReader对象,用于读取xml文件 SAXReader reader = new SAXReader(); // [2]读取xml文件,得到Document对象 Document doc = reader.read(new File("src/scores.xml"));//打印Document对象 System.out.println(doc); // [3]获取根元素 Element root = doc.getRootElement(); System.out.println(root.getName());//打印根元素名字 // [4]获取根元素下所有子元素(迭代器) Iterator<?> it = root.elementIterator(); while(it.hasNext()) { // 取出元素 Element e = (Element)it.next(); System.out.println(e.getName()); // 获取id属性 Attribute id = e.attribute("id"); System.out.println(id.getName() + "=" + id.getValue()); //打印子元素id // 获取student的子元素 Element name = e.element("name"); Element course = e.element("course"); Element score = e.element("score"); // 打印 System.out.println(name.getName()+ "=" + name.getStringValue()); System.out.println(course.getName()+ "=" + course.getStringValue());//获取元素以下所有 System.out.println(score.getName()+ "=" + score.getText());//获取当前元素 System.out.println("----------------------------------------"); } } }
-
写入xml文件中信息
package com.hb.dom4j;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class TestXML2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// [1]通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
// [2]添加并得到根元素
Element root = doc.addElement("books");
// [3]为根元素添加子元素
Element book = root.addElement("book");
Element book2 = root.addElement("book");
// [4]为book、book2元素添加属性
book.addAttribute("id", "b01");
book2.addAttribute("id", "b02");
// [5]为book添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6]为子元素添加文本信息
book2.addElement("name").addText("long time to see");
book2.addElement("author").addText("李四");
book2.addElement("price").addText("4");
name.addText("Thinking in Java");
author.addText("田一百五十六");
price.addText("156");
/*// [7]将doc输出到xml文件中即可
Writer writer = new FileWriter(new File("src/book2.xml"));
doc.write(writer);
// [8]关闭资源
writer.close();*/
// [7]格式良好的xml文件
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(new File("src/book2.xml")), format);
writer.write(doc);
// [8]关闭资源
writer.close();
}
}