XML简介
XML全称 eXtensible Markup Language,意思是可扩展标记语言(标签形式的语言)。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。即XML是一种非常灵活的语言,没有固定的标签,所有的标签都可以自定义。
通常,XML被用于信息的记录和传递。因此,XML经常被用于充当配置文件。
XML格式
(1)声明信息,用于描述XML的版本和编码格式
<?xml version="1.0" encoding="UTF-8"?>
(2)XML有且仅有一个根元素(元素:由开始标签,元素内容,结束标签组成)
(3)XML中是大小写敏感的,注意区分大小写
(4)XML中标签是成对的,而且要正确嵌套
(5)XML中属性值要使用双引号
(6)XML中标签书写方法:<!-- 这里是注释 -->
XML格式示意图:
示例:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="b01">
<name>java编程思想</name>
<author>张三</author>
<price>50.5</price>
</book>
<book id="b02">
<name>程序员面试宝典</name>
<author>李四</author>
<price>100.6</price>
</book>
</books>
练习:
示例:
<?xml version="1.0" encoding="UTF-8"?>
<studentinfo>
<student id="1">
<name>王同</name>
<class>java</class>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<class>sql</class>
<score>58</score>
</student>
</studentinfo>
XML的约束(能看懂即可)
由于XML的自由性,不同的人会写出不同的XML文档,为了方便交流,规定XML中可以出现哪些元素及哪些属性,以及它们出现的顺序。常见的XML约束,如XML DTD。
DTD简介
DTD(Document Type Definition),意思是文档类型定义。DTD用于约束XML的文档格式,保证XML是一个有效的XML
DTD可以分为两种,内部DTD,外部DTD
内部DTD使用
内部DTD定义,语法如下:
<!DOCTYPE 根元素 [元素声明]>
元素声明语法:
<!ELEMENT 元素名(子元素[, 子元素...])>
数量词
> +:表示出现1次或多次,至少一次
> ?:表示出现0次或1次
> *:表示出现任意次
属性声明语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:CDATE,表示字符数据
默认值:#REQUIRED,表示必须出现
#IMPLIED,表示不是必须的
带DTD的完整XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE studentinfo [
<!ELEMENT studentinfo (student+)>
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<studentinfo>
<student id="1">
<name>王同</name>
<course>java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</studentinfo>
外部DTD使用
创建一个独立的DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE studentinfo [
<!ELEMENT studentinfo (student+)>
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
在XML中引入外部DTD文件
<!-- 引入外部DTD文件-->
<!DOCTYPE studentinfo SYSTEM "studentinfo.dtd">
XML的解析
对XML文件进行操作,包括创建XML,对XML文件进行增删改查操作。
常见的XML解析技术:
(1)DOM解析:是官方提供的解析方式, 基于xml 树解析的
(2)SAX解析:是民间的解析方式, 基于事件的解析
(3)JDOM解析:第三方提供, 开源免费的解析方式, 比DOM 解析快
(4)DOM4J解析:第三方提供, 开源免费, 是JDOM 的升级版
DOM4J解析XML
需要导入DOM4J的jar包,解析XML的入口,是需要先拿到一个Document对象
读取XML文件中的信息:
public class TestXml {
public static void main(String[] args) throws Exception {
// [1] 创建SAXReader对象, 用于读取xml文件
SAXReader reader = new SAXReader();
// [2] 读取xml文件, 得到Document对象
Document doc = reader.read(new File("src/scores2.xml"));
// [3] 获取根元素
Element root = doc.getRootElement();
// [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());
// 获取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.getText());
System.out.println(score.getName() + "=" + score.getText());
System.out.println("--------------------------------------");
}
}
}
生成XML文件:
public class TestXml2 {
public static void main(String[] args) throws Exception {
// [1] 通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
// [2] 添加并得到根元素
Element root = doc.addElement("books");
// [3] 为根元素添加子元素
Element book = root.addElement("book");
// [4] 为book元素添加属性
book.addAttribute("id", "b01");
// [5] 为book添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6] 为子元素添加文本
name.addText("Thinking in Java");
author.addText("小伟");
price.addText("88");
// [7] 格式良好的输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(newFile("src/book2.xml")), format);
writer.write(doc);
// [8] 关闭资源
writer.close();
}
}
参考链接:https://www.jianshu.com/p/1cd1843abc78