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"?>
<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"));
		    }
		}
	}
	
}

查询结果:




添加操作:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值