21_XML
XML概述
XML(eXtensible Markup Language,可扩展的标记语言)。
作用:
- 传输数据
- 存储数据
- 存储配置信息(配置文件)
- …
XML文档结构
基本结构
.xml 是 XML 文档的扩展名。
<?xml version="1.0" encoding="utf-8"?>
<自定义的根标签>
<自定义的普通标签>内容</自定义的普通标签>
<自定义的普通标签/>
</自定义的根标签>
<?xml version="1.0" encoding="utf-8"?>
:声明,声明当前 XML 文档的版本和文档编码,使用工具时一般会自动生成- 根标签:用来在最外层包裹 XML 文档内容的
- 普通标签:自定义,且根据自己需要进行嵌套
- 双标签:
<标签名 属性名="属性值">标签内容</标签名>
开始标签 + 结束/闭合标签 - 单标签:
<标签名 属性名="属性值"/>
自闭合标签
- 双标签:
编写良好格式的XML文件
-
所有的 XML 标签必须有结束标签
<标签名></标签名>
<标签名/>
-
XML对大小写敏感
<title></Title>
-
XML必须正确的嵌套
-
XML同级标签必须对齐,下一级标签缩进4个空格
-
XML标签名或属性名不能出现特殊符号(你遵循好 Java 变量命名规范,很多问题都不存在)
<
、"
、&
转义字符
<
:<
; less than>
:>
greater than"
:"
引用'
:'
&
:&
当在标签内容中需要使用的转义字符较多时,可以通过
<![CDATA[内容]]>
来解决。
XML解析技术
大类:
-
DOM解析
-
SAX解析
小类:
-
W3C提供的API,在 JRE 类库中的 org.w3c.dom 包下
-
Dom4j (DOM for Java)
-
Hutool 中的 XmlUtil
在日常编码中,我们接触最多的除了JSON外,就是XML格式了,一般而言,我们首先想到的是引入Dom4j包,却不知JDK已经封装有XML解析和构建工具:w3c dom。但是由于这个API操作比较繁琐,因此Hutool中提供了XmlUtil简化XML的创建、读和写的过程。
XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,如果项目对XML依赖较大,依旧推荐Dom4j框架。
-
…
DOM树
DOM(Document Object Model,文档对象模型)
将 XML 文档转换为 DOM 树结构。
Dom4j
查询
// 解析XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/books.xml"));
// Element:元素/标签节点
// 获取根节点
Element rootElement = document.getRootElement();
// 获取子节点列表
List<Element> bookEleList = rootElement.elements("book");
// 遍历子节点列表
for (Element bookEle : bookEleList) {
// 获取子节点的内容
String id = bookEle.elementTextTrim("id");
String name = bookEle.elementTextTrim("name");
String author = bookEle.elementTextTrim("author");
System.out.printf("图书编号:%s,图书名称:%s,图书作者:%s\n", id, name, author);
}
新增
// 解析XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/books.xml"));
// 获取根节点
Element rootElement = document.getRootElement();
// 添加子节点
Element bookEle = rootElement.addElement("book");
bookEle.addElement("id").addText("BK003");
bookEle.addElement("name").addText("大话设计模式");
bookEle.addElement("author").addText("程杰");
// 将内存中的document写入到XML文件
// OutputFormat format = OutputFormat.createCompactFormat();
OutputFormat format = OutputFormat.createPrettyPrint();
// format.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
System.out.println("新增成功!");
修改
// 解析XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/books.xml"));
// 获取根节点
Element rootElement = document.getRootElement();
// 查询BK003图书节点
List<Element> bookEleList = rootElement.elements("book");
for (Element bookEle : bookEleList) {
String id = bookEle.elementText("id");
if (id.equals("BK003")) {
bookEle.element("name").setText("大话数据结构");
}
}
// 写入到XML文件
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
System.out.println("修改成功!");
删除
// 解析XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/books.xml"));
// 获取根节点
Element rootElement = document.getRootElement();
List<Element> bookEleList = rootElement.elements("book");
for (Element bookEle : bookEleList) {
if ("BK003".equals(bookEle.elementTextTrim("id"))) {
// bookEle.getParent().remove(bookEle);
rootElement.remove(bookEle);
}
}
// 写入到XML文件
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
System.out.println("删除成功!");
XmlUtil
// 写一些简单的读取
Document document = XmlUtil.readXML(new File("src/books.xml"));
Object value = XmlUtil.getByXPath("//books/book/id", document, XPathConstants.STRING);
System.out.println(value);
va
// 写一些简单的读取
Document document = XmlUtil.readXML(new File(“src/books.xml”));
Object value = XmlUtil.getByXPath("//books/book/id", document, XPathConstants.STRING);
System.out.println(value);