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标签中一定要出现<、>、"、'、&,我们可以使用转义字符来处理。
符号 | 转义字符 |
< | < |
> | > |
" | " |
' | ' |
& | & |
XML案例
<?xml version="1.0" encoding="UTF-8"?>
<boys>
<boy id="001">
<name>张三</name>
<age>12</age>
<description>小淘气</description>
</boy>
<boy id="002">
<name>李四</name>
<age>14</age>
<description>小乖乖</description>
</boy>
</boys>
在实际开发中,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="坚果3"/>
<type name="坚果pro2"/>
<type name="坚果pro"/>
</brand>
<brand name="索尼">
<type name="Xperia XZ1"/>
<type name="Xperia XZ2"/>
</brand>
<brand name="小米">
<type name="Mix2s"/>
<type name="Mix2"/>
</brand>
</phone>
查询操作:
package com.chenjie.core;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLDemo {
public static void main(String[] args) {
//创建reader对象
SAXReader reader = new SAXReader();
//解析xml文件,转换为document对象
Document document = null;
try {
document = reader.read("resource/phone.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
//获取document的根节点,即phone标签对应的节点
Element root = document.getRootElement();
//通过迭代的方式,层层解析document
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()){
//获取brand元素对象,即brand标签对应的节点
Element brand = (Element)iter.next();
//获取brand节点的name属性值,打印
System.out.println(brand.attributeValue("name"));
//继续迭代,获取brand的子节点type节点
Iterator<Element> iter2 = brand.elementIterator();
while(iter2.hasNext()){
//获取type节点的name属性值,打印
Element type = (Element)iter2.next();
System.out.println(type.attributeValue("name"));
}
}
}
}
查询结果:
添加操作:
package com.chenjie.core;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XMLDemo {
public static void main(String[] args) throws DocumentException, IOException {
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:
更新操作:
package com.chenjie.core;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XMLDemo {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read("resource/phone.xml");
Element root = document.getRootElement();
Iterator<Element> 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:
删除操作:
package com.chenjie.core;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XMLDemo {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read("resource/phone.xml");
Element root = document.getRootElement();
Iterator<Element> 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的常规用法。