首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础之XML解析

Java基础之XML解析

作者头像
南风
发布2019-04-22 16:47:00
7070
发布2019-04-22 16:47:00
举报
文章被收录于专栏:Java大联盟Java大联盟

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的常规用法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java大联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档