XML文档解析:dom4j对xml文档进行解析

dom4j的概述

介绍(来自百度百科):

dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

DOM4J常用的类:

  • Document : 表示整个XML文档。文档Document对象是通常被称为DOM树。
  • Element : 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
  • Attribute : 表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
  • Node : 代表元素,属性或处理指令

dom4j常用的方法:

  • SAXReader.read(xmlSource)():构建XML源的DOM4J文档。
  • Document.getRootElement():得到的XML的根元素。
  • Document.setXMLEncoding​():设置此文档的编码,因为它将出现在文档的XML声明部分中。
  • Element.element(Element):获得指定元素。
  • Element.attributeValue(Attribute):获取指定的属性值。
  • Element.addAttributes() - 设置修改属性值。
  • Element.node(index) - 获得在元素特定索引XML节点。
  • Element.attributes() - 获取一个元素的所有属性。

前期准备:

下载dom4j解析xml文档所需要的jar包:根据需要下载和合适的dom4j

具体的代码展示与解析:

步骤:

  • 1、获得解析器工厂
  • 2、根据解析器工厂获得解析器
  • 3、根据解析器获得Document对象
  • 4、根据解析器获得Doucumen对象
  • 5、根据Document对象获得根元素
    • 从根元素获取根下面所有的子元素
    • 得到子元素可以获取元素标签和内容以及属性
    • 根据标签和内容以及属性可以进行增删改查操作
  • 6、最后一步进行回写操作(如果有必要)

首先附上books.xml

<?xml version="1.0" encoding="utf-8"?>
<books> 
  <book id='1'> 
    <id>001</id>  
    <name>Python3网络爬虫开发实战</name>  
    <author>崔庆才</author>  
    <price>75.0</price>  
    <addNode>添加的节点</addNode> 
  </book>  
  <book id='2'>
    <id>002</id>
    <name>Linux鸟哥的私房菜</name>
    <author>鸟哥</author>
    <price>70.0</price>
  </book>
</books>

dom4j对xml文件的基本操作:

public static void main(String[] args) {
		// 1.获得解析器
		SAXReader reader = new SAXReader();
		try {
			// 2.根据解析器获得document对象
			Document document = reader.read(new File("xml/books.xml"));
			// 3.获得根元素
			Element rootElement = document.getRootElement();
			// 4.获得根元素下所有的子元素
			List<Element> list = rootElement.elements();
			// 5.遍历子元素
			for (Element element : list) {
				// 6.获得元素的属性
				String attribute = element.attributeValue("id");
				System.out.println(attribute);
				// 7.获得子元素下所有的子元素
				List<Element> elements = element.elements();
				// 8.遍历所有子元素下所有的子元素
				for (Element element2 : elements) {
					System.out.println(element2.getText());
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

dom4j对xml文件的增加操作:

	@Test
	// 添加元素操作
	public void Test1() throws DocumentException, IOException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得要插入的位置
		Element book = rootElement.element("book");
		List<Element> list = book.elements();
		// 4、创建元素并插入到book中
		Element addElement = book.addElement("addNode");
		addElement.addText("添加的节点");
		// Element address = DocumentHelper.createElement("address");
		// address.setText("河南南阳");

		// Element addText = address.addText("河南南阳");
		// System.out.println(address);
		// System.out.println(addText);
		// 5、添加元素
		// book.add(address);
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 在指定位置添加元素操作
	public void Test2() throws DocumentException, IOException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得根下的子元素
		Element book = rootElement.element("book");
		// 创建元素
		Element data = DocumentHelper.createElement("data");
		data.setText("2016-12-15");
		// 获得book下的所有子元素
		List<Element> list = book.elements();
		list.add(1, data);
		// 回写
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 添加属性
	public void Test4() throws DocumentException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得根下的子元素
		Element book = rootElement.element("book");
		// 添加属性language
		book.addAttribute("language", "zh");
		// 回写
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

dom4j对xml文件的删除操作:

	@Test
	// 添加元素操作
	public void Test1() throws DocumentException, IOException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得要插入的位置
		Element book = rootElement.element("book");
		List<Element> list = book.elements();
		// 4、创建元素并插入到book中
		Element addElement = book.addElement("addNode");
		addElement.addText("添加的节点");
		// Element address = DocumentHelper.createElement("address");
		// address.setText("河南南阳");

		// Element addText = address.addText("河南南阳");
		// System.out.println(address);
		// System.out.println(addText);
		// 5、添加元素
		// book.add(address);
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 在指定位置添加元素操作
	public void Test2() throws DocumentException, IOException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得根下的子元素
		Element book = rootElement.element("book");
		// 创建元素
		Element data = DocumentHelper.createElement("data");
		data.setText("2016-12-15");
		// 获得book下的所有子元素
		List<Element> list = book.elements();
		list.add(1, data);
		// 回写操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 添加属性
	public void Test4() throws DocumentException {
		// 1、获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、获得根元素
		Element rootElement = document.getRootElement();
		// 3、获得根下的子元素
		Element book = rootElement.element("book");
		// 添加属性language
		book.addAttribute("language", "zh");
		// 回写
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

dom4j对xml文件的修改操作:

	@Test
	// 修改元素操作
	public void Test6() throws DocumentException {
		// 1.获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2.获得xml文件的根元素
		Element rootElement = document.getRootElement();
		// 3.获得book元素下的子元素data元素
		Element book = rootElement.element("book").element("data");
		book.setText("1997-12-15");
		// 4.进行回写操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 修改元素属性
	public void Test7() throws DocumentException {
		// 1.获得document对象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2.获得xml文件的根元素
		Element rootElement = document.getRootElement();
		// 3.获得book元素
		Element book = rootElement.element("book");
		// 4.设置修改属性值
		book.addAttribute("language", "en");
		// book.setAttributeValue("language", "en");//过时的代替的方式是addAttribute
		// 5.进行回写操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

将dom4j中的获取Document对象和回写操作封装起来:

进行回写的原因:对books.xml文件的增删改操作只是在内存中,我们需要将内存中已经增删改之后的结果重新刷到books.xml文件中
官方的得到Document对象:

public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        //url为xml文件的路径
        Document document = reader.read(url);
        return document;
    }

官方的将文档写入文件

//通过该方法可以快速简便地将Document(或任何Node)写入a 。 Writerwrite()
FileWriter out = new FileWriter("foo.xml");
document.write(out);
out.close();

根据文档自己编写的:

//saxReaderUtil类
public class saxReaderUtil {
	public static Document getDocument(String uri) throws DocumentException {
		// 获得解析器工厂
		SAXReader reader = new SAXReader();
		// 根据解析器工厂获得document
		Document document = reader.read(new File(uri));
		// 返回document对象
		return document;
	}

	// 回写操作
	public static void backWrite(Document document, String uri) {
		try {
			// 方法creatCompactFormat()是不可以格式化文件
			// OutputFormat of = OutputFormat.createCompactFormat();
			// 方法creatPrettyPrint是可以格式文件的
			// OutputFormat of = OutputFormat.createPrettyPrint();
			// XMLWriter writer = new XMLWriter(new OutputStreamWriter(new
			// FileOutputStream("xml/books.xml"),"utf-8"),of);
			// writer.write(document);
			// writer.close();
			// 问题:乱码
			// 原因:使用FileWriter默认的编码是GBK,而books.xml的编码格式是utf-8
			// 解决乱码的方案使用OutputStreamWriter

			// 解决乱码的方案二:
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			XMLWriter writer = new XMLWriter(new FileOutputStream(uri), format);
			writer.write(document);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值