专栏首页Java大联盟Java基础之XML解析

Java基础之XML解析

Java大联盟

致力于最高效的Java学习

今天给大家分享关于XML解析的实际应用,XML简单来说就是一种文件格式,这种格式的文件在Java程序开发中使用地非常广泛,一般用来做配置文件。

比如需要在web.xml中配置web的相关设置,同时任何一个主流框架都需要通过配置XML文件的方式来完成业务逻辑到框架体系的对接。当然,如果使用SpringBoot这种快速开发框架,则可以大大减少对于XML文件的配置。总体来讲,XML在开发中使用的频率很高,而且主要是用来做配置文件的。

定义

官方定义是Extensible Markup Language,可扩展标记语言,简称XML。

特点

1.XML与操作系统、编程语言的开发平台无关。

2.实现不同系统之间的数据交换。

3.XML文档内容由一系列标签元素组成。

标签语法:

<元素名 属性名="属性值">元素内容</元素名>

注意事项

1.属性值用双引号包裹。

2.一个元素可以有多个属性。

3.属性值中不能直接包含<、>、"、'、不建议直接包含&。

4.XML标签对大小写敏感。

5.XML必须有正确的嵌套结构。

6.同级标签以缩进对齐。

7.元素名称可以包含字母、数字或其他的字符。

8.元素名称不能以数字或者标点符号开始。

9.元素名称中不能含空格。

如果XML标签中一定要出现<、>、"、'、&,我们可以使用转义字符来处理。

符号

转义字符

<

&lt;

>

&gt;

"

&quot;

'

&apos;

&

&amp;

XML案例

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="001">
        <author>张三</author>
        <title>Java高级编程</title>
        <description>Java高级编程理论加实践讲解</description>
    </book>
    <book id="002">
        <author>李四</author>
        <title>MySQL数据库</title>
        <description>关系型数据库概述</description>
    </book>
</books>

在实际开发中,XML文件并不复杂,我们的重点是读取XML,而非定义XML的结构,只要能快速获取有效信息即可。

那么我们如何通过Java程序读取XML信息,并且对XML文件作出修改呢?

有多种方式,可以采用原生的dom解析方式,但是这种方式步骤比较繁琐,通常情况下,我们会使用第三方的开源API,dom4j来完成。

dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过了官方的dom解析技术。

下载地址:https://dom4j.github.io/

下载完成,将dom4j的jar文件导入工程即可,非常简单。

接下来,我们使用dom4j对一个保存手机信息的XML文件进行增删改查的操作。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<phone>
    <brand name="华为">
        <type name="Mate10"/>
        <type name="P20"/>
        <type name="畅享6"/>
    </brand>
    <brand name="苹果">
        <type name="iPhoneX"/>
        <type name="iPhone8"/>
    </brand>
    <brand name="小米">
        <type name="Note4"/>
        <type name="MIX2"/>
     </brand>
</phone>

查询操作:

//创建reader对象
SAXReader reader = new SAXReader();
//解析xml文件,转换为document对象
Document document = reader.read("resource/phone.xml");
//获取document的根节点,即phone标签对应的节点
Element root = document.getRootElement();
//通过迭代的方式,层层解析document
Iterator iter = root.elementIterator();
while(iter.hasNext()){
    //获取brand元素对象,即brand标签对应的节点
    Element brand = (Element)iter.next();
    //获取brand节点的name属性值,打印
    System.out.println(brand.attributeValue("name"));
    //继续迭代,获取brand的子节点type节点
    Iterator iter2 = brand.elementIterator();
    while(iter2.hasNext()){
        //获取type节点的name属性值,打印
        Element type = (Element)iter2.next();
        System.out.println(type.attributeValue("name"));
    }
}

查询结果:

添加操作:

SAXReader reader = new SAXReader();
Document document = reader.read("resource/phone.xml");
Element root = document.getRootElement();
//给根节点添加brand节点
Element brand = root.addElement("brand");
//给brand节点添加name属性
brand.addAttribute("name", "三星");
//给brand节点添加type节点
Element type = brand.addElement("type");
//给type节点添加name属性
type.addAttribute("name", "S9");
//将document对象保存到xml文件中
//设置编码
OutputFormat of = OutputFormat.createCompactFormat();
of.setEncoding("utf-8");
//获取输出流对象
FileOutputStream fs = new FileOutputStream("resource/phone.xml");
//获取XMLWriter对象
XMLWriter xw = new XMLWriter(fs, of);
//调用write方法写入到xml文件
xw.write(document);
//关闭资源
xw.close();

添加完成,XML:

更新操作:

SAXReader reader = new SAXReader();
Document document = reader.read("resource/phone.xml");
Element root = document.getRootElement();
Iterator iter = root.elementIterator();
int i = 1;
while(iter.hasNext()){
    Element brand = (Element)iter.next();
    //循环遍历,给每一个brand节点添加id属性
    brand.addAttribute("id", i+"");
    i++;
}
//将document对象保存到xml文件中
//设置编码
OutputFormat of = OutputFormat.createCompactFormat();
of.setEncoding("utf-8");
//获取输出流对象
FileOutputStream fs = new FileOutputStream("resource/phone.xml");
//获取XMLWriter对象
XMLWriter xw = new XMLWriter(fs, of);
//调用write方法写入到xml文件
xw.write(document);
//关闭资源
xw.close();

更新完成,XML:

删除操作:

SAXReader reader = new SAXReader();
Document document = reader.read("resource/phoneInfo.xml");
Element root = document.getRootElement();
Iterator iter = root.elementIterator();
while(iter.hasNext()){
    Element brand = (Element)iter.next();
    //删除brand为三星的节点
    if(brand.attributeValue("name").equals("三星")){
        brand.getParent().remove(brand);
    }
}
//将document对象保存到xml文件中
//设置编码
OutputFormat of = OutputFormat.createCompactFormat();
of.setEncoding("utf-8");
//获取输出流对象
FileOutputStream fs = new FileOutputStream("resource/phone.xml");
//获取XMLWriter对象
XMLWriter xw = new XMLWriter(fs, of);
//调用write方法写入到xml文件
xw.write(document);
//关闭资源
xw.close();

删除完成,XML:

以上就是通过dom4j对XML文件进行增删改查的操作,但是实际开发中,我们使用更多的只有查询操作。新增、修改和删除一般都是手动去完成,查询操作结合反射机制去动态处理需求,是XML的常规用法。

本文分享自微信公众号 - Java大联盟(javaunion),作者:南风

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hibernate实体关系映射

    上一篇文章我们学习了Hibernate的框架搭建,并且完成了单表的CRUD操作,今天我们来学习Hibernate中的多表关联。

    南风
  • 微信刷卡支付API详解

    南风
  • 微信刷卡支付API详解

    最近因项目需要微信支付,通过扫码抢扫描微信付款码,调用微信刷卡支付API完成扣费,过程中遇到了遇到了一些问题,填了很多坑,所以把自己的经验分享给大家,本篇文章介...

    南风
  • 1055 集体照 (25 分)

    每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数 N(≤104,总人数)和 K(≤10,总排数)。随后 N 行,每行给出一个人的名字(不包含空...

    可爱见见
  • 33. Python redis的 h

    #name 对应的hash中设置一个键值对(不存在,则创建键值对;否则,修改键值对)

    用户2398817
  • Golang map使用注意事项

    map 是 Golang 中的方便而强大的内建数据结构,是一个同种类型元素的无序组,元素通过另一类型唯一的键进行索引。其键可以是任何相等性操作符支持的类型, 如...

    Dabelv
  • Neo4j-3.1 索引

    悠扬前奏
  • class.getResource和classLoader.getResource 区别

    平凡的学生族
  • Kubernetes之Secrets

    Secrets是Kubernetes中一种对象类型,用来保存密码、私钥、口令等敏感信息。与直接将敏感信息嵌入image、pod相比,Secrets更安全、更灵活...

    菲宇
  • ansile(3)playbook 使用

    顾名思义,playbook就是类似演戏的剧本一样,将所有的戏码全部放在一起,官方说明如下:

    用户2398817

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动