欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java核心--XML解析

程序员文章站 2022-03-14 19:05:56
...

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


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


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

查询结果:


Java核心--XML解析


添加操作:


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:


Java核心--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:


Java核心--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:


Java核心--XML解析


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

相关标签: xml解析

上一篇: 注解-第五篇

下一篇: 自定义注解