加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML-解析技术续(dom4j解析)

发布时间:2020-12-16 05:15:25 所属栏目:百科 来源:网络整理
导读:我们知道了常用的dom解析以及sax解析。那么还有别的解析技术吗?答案是肯定的,接下来我将给大家来解释一下另外一个解析技术——dom4j。 什么是dom4j呢? Dom4j 是一个简单、灵活的开放源代码的库。 Dom4j 是由早期开发 JDOM 开发的。与 JDOM 不同的是, dom

我们知道了常用的dom解析以及sax解析。那么还有别的解析技术吗?答案是肯定的,接下来我将给大家来解释一下另外一个解析技术——dom4j。

什么是dom4j呢?

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM开发的。与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4jAPI相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j 是一个非常优秀的 JavaXML API ,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j ,例如 Hibernate ,包括 sun 公司自己的 JAXM 也用了 Dom4j
使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。
同样,dom4j也是对于文件的操作,那么有以下几种获取文档对象的方法:

1.读取XML文件,获得document对象

SAXReaderreader = new SAXReader();
Document document= reader.read(newFile("input.xml"));

¨

2.解析XML形式的文本,得到document对象.

String text = "<members></members>";
Document document= DocumentHelper.parseText(text);

¨

3.主动创建document对象.

Document document= DocumentHelper.createDocument();
//创建根节点

Elementroot = document.addElement("members");

下面我主要介绍第一种获取document对象的方式:

xml文件:

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

<四大名著> 
  <西游记 id="x001"> 
    <作者>吴承恩</作者> 
  </西游记>  
  <红楼梦 name="作者"> 
    <朝代>清朝</朝代><![CDATA[asd]]>
  </红楼梦> 
</四大名著>


dom4j解析测试:

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

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

public class Demo01 {

	@Test
	public void test() throws Exception {

		// 创建saxReader对象
		SAXReader reader = new SAXReader();
		// 通过read方法读取一个文件 转换成Document对象
		Document document = reader.read(new File("src/dom4j/sida.xml"));

		Element node = document.getRootElement();
		//listNodes(node);
		
		
		//获取四大名著元素节点中,自节点名称为红楼梦元素的节点
		Element element=node.element("红楼梦");
		
		//删除指定属性
		Attribute attr=element.attribute("id");//获取指定属性
		element.remove(attr);
		
		//添加指定属性
		element.addAttribute("name","作者");
		
		//在指定节点下面添加文本的操作
		Element newElement=element.addElement("朝代");//获取指定元素节点
		newElement.setText("清朝");
		
		//删除指定节点的操作
		Element author=element.element("作者");//获取想要删除的元素节点
		boolean flag=element.remove(author);//通过该元素节点的父节点调用remove()方法来删除指定节点
		System.out.println(flag);//判断返回的布尔值,如果为真则删除成功,如果为假则删除不成功。
		
		
		
        //插入一个新的CADA区域
		element.addCDATA("asd");//不被编译,原样输出
		writer(document);
	}

	/**
	 * 遍历当前节点元素下面的所有(元素的)子节点
	 * 
	 * @param node
	 */
	public void listNodes(Element node) {
		System.out.println("当前节点的名称::" + node.getName());
		// 获取当前节点的所有属性节点
		List<Attribute> list = node.attributes();
		// 遍历属性节点
		for (Attribute attr : list) {
			System.out.println(node.getName() + "-----" + attr.getName()
					+ "---" + attr.getValue());
			//在这里getText()和getValue()一样
		}
		if (!(node.getTextTrim().equals(""))) {//不把空格和换行输出
			System.out.println("文本内容::::" + node.getText());
		}

		// 当前节点下面子节点迭代器
		Iterator<Element> it = node.elementIterator();
		// 遍历
		while (it.hasNext()) {
			// 获取某个子节点对象
			Element e = it.next();
			// 对子节点进行遍历
			listNodes(e);
		}
	}
	
	/**
	 * 将xml文件写出去
	 * @param document
	 * @throws Exception
	 */
	public void writer(Document document) throws Exception{
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer=new XMLWriter(new FileWriter("src/dom4j/xx.xml"),format);
		writer.write(document);
		writer.flush();
		writer.close();
		
	}
}


字符串与XML的转换

import java.io.File;
import java.io.FileWriter;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class Demo02 {
	@Test
	public void test() throws Exception{
		//test1();
		test2();
		//test3();
	}
	
	//将指定字符串转换为document对象
	public void test1() throws Exception{
		String text="<csdn><java>Java班</java><net>Net班</net></csdn>";
		Document document=DocumentHelper.parseText(text);//通过DocumentHelper的parseText()方法将指定字符串解析为一个document对象
		
		//将文件写出去
		writer(document);
	}
	
	//定义主动创建document对象的方法
	public void test3() throws Exception{
		Document document=DocumentHelper.createDocument();//主动生成document对象
		//设置根节点
		Element root=document.addElement("csdn");
		Element java=root.addElement("java");
		java.setText("2012级-CSDN-java班");
		Element net=root.addElement("net");
		net.setText("2012级-CSDN-net班");
		
		//将文件写出去
		writer(document);
	}
	
	//定义向外写出文件的方法
	public void writer(Document document) throws Exception{
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("src/dom4j/a.xml"),format);
		writer.write(document);
		writer.close();
	}
	
	//将xml文件转换为字符串
	public void test2() throws Exception{
		SAXReader reader=new SAXReader();//创建sax读取器对象
		Document document=reader.read(new File("src/dom4j/a.xml"));//通过读取器读取指定xml文件,并将其转换为document对象
		Element root=document.getRootElement();//获取根节点
		
		//将xml文档转换为string字符串
		String docXmlText=document.asXML();
		System.out.println(docXmlText);
		System.out.println("-------------");
		String rootXmlText=root.asXML();
		System.out.println(rootXmlText);
		System.out.println("-------------");
		Element java=root.element("java");
		String s=java.asXML();
		System.out.println(s);
		System.out.println("-------------");
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读