21_XML

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 变量命名规范,很多问题都不存在)

    <"&

转义字符

  • <&lt; less than
  • >&gt; greater than
  • "&quot; 引用
  • '&apos;
  • &&amp;

当在标签内容中需要使用的转义字符较多时,可以通过 <![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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值