JAVA 使用Dom4j 解析XML

JAVA 使用Dom4j 解析XML解析XML的方式有很多,本文介绍使用dom4j解析xml文件

大家好,又见面了,我是你们的朋友全栈君。

解析XML的方式有很多,本文介绍使用dom4j解析xml。

1、环境准备

(1)下载dom4j-1.6.1.jar

(2)下载junit-4.10.jar

2、温馨提示

解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

(1)自己创建Document对象

Document document = DocumentHelper.createDocument();
		Element root = document.addElement("students");

其中students是根节点,可以继续添加其他节点等操作。

(2)读取XML文件获取Document对象

//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("XXXX.xml"));

(3)读取XML文本内容获取Document对象

String xmlStr = "<students>......</students>";
		Document document = DocumentHelper.parseText(xmlStr);

3、示例

(1)xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student1 id="001">
		<微信公众号>@残缺的孤独</微信公众号>
		<学号>20140101</学号>
		<地址>北京海淀区</地址>
		<座右铭>要么强大,要么听话</座右铭>
	</student1>
	<student2 id="002">
		<新浪微博>@残缺的孤独</新浪微博>
		<学号>20140102</学号>
		<地址>北京朝阳区</地址>
		<座右铭>在哭泣中学会坚强</座右铭>
	</student2>
</students>

(2)解析过程

package cn.com.yy.dom4j;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Dom4JforXML {
	
	@Test
	public void test() throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		//遍历
		listNodes(root);
	}
	
	//遍历当前节点下的所有节点
	public void listNodes(Element node){
		System.out.println("当前节点的名称:" + node.getName());
		//首先获取当前节点的所有属性节点
		List<Attribute> list = node.attributes();
		//遍历属性节点
		for(Attribute attribute : list){
			System.out.println("属性"+attribute.getName() +":" + attribute.getValue());
		}
		//如果当前节点内容不为空,则输出
		if(!(node.getTextTrim().equals(""))){
			 System.out.println( node.getName() + ":" + node.getText());  
		}
		//同时迭代当前节点下面的所有子节点
		//使用递归
		Iterator<Element> iterator = node.elementIterator();
		while(iterator.hasNext()){
			Element e = iterator.next();
			listNodes(e);
		}
	}
}

(3)解析结果

当前节点的名称:students
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:student2
属性id:002
当前节点的名称:新浪微博
新浪微博:@残缺的孤独
当前节点的名称:学号
学号:20140102
当前节点的名称:地址
地址:北京朝阳区
当前节点的名称:座右铭
座右铭:在哭泣中学会坚强

4、dom4j操作节点属性

使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。

(1)代码示例

@Test
	public void test2()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		
		System.out.println("-------添加属性前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//获取其属性
		Attribute idAttribute = student1Element.attribute("id");
		//删除其属性
		student1Element.remove(idAttribute);
		//为其添加新属性
		student1Element.addAttribute("name", "这是student1节点的新属性");
		System.out.println("-------添加属性后------");
		listNodes(student1Element);
	}

(2)结果

-------添加属性前------
当前节点的名称:student1
<span style="background-color: rgb(255, 0, 0);">属性id:001</span>
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加属性后------
当前节点的名称:student1
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性
</span></span>当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话

5、dom4j新增节点

使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。

(1)代码

//添加节点
	@Test
	public void test3()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		System.out.println("-------添加节点前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//添加phone节点
		Element phoneElement = student1Element.addElement("phone");
		//为phone节点设置值
		phoneElement.setText("137xxxxxxxx");
		System.out.println("-------添加节点后------");
		listNodes(student1Element);
	}

(2)结果

-------添加节点前------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加节点后------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:phone
<span style="color:#ff0000;">phone:137xxxxxxxx</span>

6、把Document对象写入新的文件

有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。

(1)代码

//添加节点后,写入新的文件
	@Test
	public void test4()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		System.out.println("-------添加节点前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//添加phone节点
		Element phoneElement = student1Element.addElement("phone");
		//为phone节点设置值
		phoneElement.setText("137xxxxxxxx");
		System.out.println("-------添加节点后------");
		listNodes(student1Element);
		//把student1Element写入新文件
		writerDocumentToNewFile(document);
		System.out.println("---写入完毕----");
	}
	
	//document写入新的文件
	public void writerDocumentToNewFile(Document document)throws Exception{
		//输出格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		//设置编码
		format.setEncoding("UTF-8");
		//XMLWriter 指定输出文件以及格式
		XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);
		
		//写入新文件
		writer.write(document);
		writer.flush();
		writer.close();
	}

(2)查看s1.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<students> 
  <student1 id="001"> 
    <微信公众号>@残缺的孤独</微信公众号>  
    <学号>20140101</学号>  
    <地址>北京海淀区</地址>  
    <座右铭>要么强大,要么听话</座右铭>  
    <phone>137xxxxxxxx</phone>
  </student1>  
  <student2 id="002"> 
    <新浪微博>@残缺的孤独</新浪微博>  
    <学号>20140102</学号>  
    <地址>北京朝阳区</地址>  
    <座右铭>在哭泣中学会坚强</座右铭> 
  </student2> 
</students>

因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。

还有输出格式的问题,在此处使用的是OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

<?xml version="1.0" encoding="UTF-8"?>
<students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>


最后,为大家附上源代码。
java dom4j解析xml

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152013.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • objective c源码_以下C代码有哪些错误

    objective c源码_以下C代码有哪些错误我是前言看开源代码时,总会看到一些大神级别的代码,给人眼前一亮的感觉,多数都是被淡忘的C语言语法,总结下objc写码中遇到的各类非主流代码技巧和一些妙用:[娱乐向]objc最短的方法声明[C]结构体的初始化[C]三元条件表达式的两元使用[C]数组的下标初始化[objc]可变参数类型的block[objc]readonly属性支持扩展的写法[C]小括号内联复合表达式[娱乐向]奇葩的C

    2022年10月18日
    3
  • 关于 java JSONArray JSONObject转换问题

    关于 java JSONArray JSONObject转换问题importlhy.client.json.JSONArray;importlhy.client.json.JSONException;importlhy.client.json.JSONObject;publicclassMyJson{publicstaticvoidmain(String[]args)throwsJSO…

    2022年5月5日
    46
  • C语言结构体(struct)常见使用方法[通俗易懂]

    C语言结构体(struct)常见使用方法[通俗易懂]注意:盗版是不会得到修正和更新的!今天复习一下struct,顺便挖掘一下以前没注意的小细节:基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。(因为C++和C有共通之处,但是在结构体上的某些机制又有所不同,所以后边提了一下,不喜欢可以略过)结构体定义:…

    2022年5月12日
    74
  • mysql拼接字段的函数_SQL字符串拼接

    mysql拼接字段的函数_SQL字符串拼接文章目录测试数据1、CONCAT(直接拼接函数)2、CONCAT_WS(使用指定的分割符去拼接字符串)3、GROUP_CONCAT(将查询的数据先行直接连接,然后将列通过指定的分割符拼接)测试数据SELECTid,login_name,real_nameFROM`iam_user`whereidin(17,18,19)idlogin_namereal_name…

    2022年9月29日
    4
  • gis如何无缝拼接两张图_arcgis多幅影像图拼接

    gis如何无缝拼接两张图_arcgis多幅影像图拼接APAP.cpp#include”stdafx.h”#include<iostream>#include<cmath>#include”opencv2/features2d/features2d.hpp”#include”opencv2/highgui/highgui.hpp”#include”opencv2/opencv_modules.hpp”#include”opencv2/calib3d/calib3d.hpp”#include..

    2022年9月22日
    2
  • 手机常见分辨率及代表机型有哪些_分辨率有哪几种

    手机常见分辨率及代表机型有哪些_分辨率有哪几种320×2404:31.33333HVGA/Half-sizeVGA640×4804:31.33333VGA/VideoGraphicArray/显示绘图阵列800×4805:31.66667WVGA/WideVGA854×48016:91.77916FWVGA/FullWideVGA960×54016:91.777

    2022年8月13日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号