XML概述
XML(EXtensible(扩展) Markup(标记) Language(语言), 可扩展的标记语言)
作用:
- 传输数据
- 存储数据
- 存储配置信息(配置文件)
- ...
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不能出现特殊符号:
- <、"、&
转义字符
- <:< less than
- >:> greater than
- ":&quat; 引用
- ':'
- &:&
当在标签内容中需要使用的转义字符较多时,可以通过 '<![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 树结构。
DOM数结构由节点(Node)组成
节点类型:
- 元素类型(标签、Element)
- 属性类型(Attribute)
- 文本类型(Text)
- 注释类型(Comment)
- ...
程序员眼里的数。
Dom4j
查询
// 解析XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/books.xml"));
// Element:元素/标签节点
// 获取根节点
Element root = document.getRootElement();
// 获取子节点列表
List<Element> bookEleList = root.elements("book");
// 遍历子节点列表
for (Element bookEle : bookEleList) {
// 获取子节点的内容
String id = bookEle.elementTextTrim("id");
String name = bookEle.elementTextTrim("name");
String author = bookEle.elementTextTrim("author");
System.out.println("图书编号:" + 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);