Java基础之XML解析

Posted Java大联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础之XML解析相关的知识,希望对你有一定的参考价值。


Java大联盟

致力于最高效的Java学习

Java基础之XML解析  Java基础之XML解析


Java基础之XML解析


今天给大家分享关于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解析技术。



下载完成,将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"));
   }
}


查询结果:


Java基础之XML解析


添加操作:


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:


Java基础之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:


Java基础之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:


Java基础之XML解析


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




Java基础之XML解析










专业 热爱 专注

致力于最高效的Java学习

Java大联盟




以上是关于Java基础之XML解析的主要内容,如果未能解决你的问题,请参考以下文章

Java解析XML之Dom4j

java基础之XML

从流输入中解析没有根元素的 XML 片段列表

java解析xml的几种方式哪种最好?

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

Java语言基础之方法的设计