您的位置:首页 > 其它

Dom4J对XML文件的读取和写入

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

而学习java的时候,我们免不了就是大堆小堆的配置文件,那么如何读取配置文件呢。

使用前准备的jar包

dom4j-1.6.1.jar

jaxen-1.1-beta-6.jar

下载地址:http://sourceforge.net/projects/dom4j/files/latest/download

我用的是MyEclipse新建了一个普通的java项目,然后新建一个lib文件,把上边的两个jar包放进去,然后右键--》build path--》Add to Bulid Path,这样我们src下的类文件就可以使用了。


Dom4j的学习


读取XML文件

读取得先有一个XML文件不是,所以先给大家XML文件


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

<ROW>
  <C0>1</C0>
  <foo>7891</foo>
  <ENAME>sdffff</ENAME>
  <JOB>job</JOB>
  <MGR></MGR>
  <HIREDATE>2010-1-1</HIREDATE>
  <SAL>5000.00</SAL>
  <COMM>1000.00</COMM>
  <DEPTNO></DEPTNO>
</ROW>

<foo>
  <C0>2</C0>
  <foo>7369</foo>
  <ENAME>SMITH</ENAME>
  <JOB>CLERK</JOB>
  <MGR>7902</MGR>
  <HIREDATE>1980-12-17</HIREDATE>
  <SAL>800.00</SAL>
  <COMM></COMM>
  <DEPTNO>20</DEPTNO>
</foo>
<a href="www.baidu.com">百度</a>
<a href="http://my.csdn.net/lovemenghaibin'">孟海滨博客</a>
</ROWDATA>




首先要读取一个XML文件,你得先找到他,那么找到他的方法就如下
/**
	 * 根据地址获得一个Document(XML文件)
	 * @param url  地址
	 * @return Docuyment
	 * @throws DocumentException
	 */
	public Document parse(String url) throws DocumentException {
		SAXReader reader = new SAXReader();
		Document document = reader.read(url);
		return document;
	}


找到以后呢,当然是找到了文档,我们就要读取礼拜的数据,或者找节点。这里我们写了几个找节点的方法,从而获得他们所有的节点,用了迭代器来循环。分别是找到根节点,找到跟元素为'foo'的元素,找到子节点的属性。
/**
	 * 找Document里的元素
	 * @param document
	 * @throws DocumentException
	 */
	public void bar(Document document) throws DocumentException {
		Element root = document.getRootElement();
		
		//获得根节点
		for( Iterator itr = root.elementIterator(); itr.hasNext();){
			Element element = (Element)itr.next();
			//TODO
		}

		//遍历子元素的根元素名称“foo”的节点
		for ( Iterator i = root.elementIterator("foo"); i.hasNext();){
			Element foo = (Element)i.next();
			//TODO
		}
		
		//遍历子元素的属性
		for (Iterator i = root.attributeIterator(); i.hasNext();){
			Attribute attribute = (Attribute) i.next();
			//TODO
		}
	}


上边是找到了所有的节点,那么我们当然是要获取节点里边的值的,就好像我们链接数据库,绝对不是找到那张表就可以了,而是需要礼拜的数据,而获取数据也分为两种,获取单一的某一个节点(Node)的值和获取所有节点的值。

获取单一节点的值
/**
	 * 读取文档中某一个节点的值
	 * @param document
	 * @throws DocumentException
	 */
	public void barXPath(Document document) throws DocumentException{

		List list = document.selectNodes("//ROWDATA/ROW");
		Node node = document.selectSingleNode("//ROWDATA/ROW/ENAME");
		System.out.println("node1 = " + node.getStringValue());
		
	}


获取所有节点的值(for循环)
/**
	 * 循环遍历每一个节点
	 * @param element
	 */
	public void treeWalk(Element element) {
		for ( int i=0, size = element.nodeCount(); i < size; i++){
			Node node = element.node(i);
			if (node instanceof Element ) {
				treeWalk ((Element)node);
				System.out.println("node = " + node.getText());
			}
			else {
				//do something
			}
		}
		
		
	}


当然也有一种获取一个节点的属性值,例如我们在HTML中都有链接<a href ='http://my.csdn.net/lovemenghaibin'>孟海滨博客</a>,那我如何获得链接呢。代码如下
/**
	 * 读取文档中的链接
	 * @param document
	 * @throws DocumentException
	 */
	public void findLink(Document document) throws DocumentException {
		List list = document.selectNodes("//a/@href");
		for( Iterator iter = list.iterator(); iter.hasNext();) {
			Attribute attribute = (Attribute) iter.next();
			String url = attribute.getValue();
			System.out.println("url = " + url.toString());
		}
	}


创建XML文件

创建Document
/**
	 * 创建一个Document的文本
	 * @return
	 */
	public Document createDocument() {
		//创建document
		Document document = DocumentHelper.createDocument();
		//创建根元素
		Element root = document.addElement("root");
		
		//添加子节点1和设置属性
		Element auther1 = root.addElement("auther")
				.addAttribute("name", "James")
				.addAttribute("location", "UK")
				.addText("James SXtrachan");
		//添加子节点2和设置属性
		Element auther2 = root.addElement("auther")
				.addAttribute("name", "Bob")
				.addAttribute("location", "US")
				.addText("James McWhirter");
		return document;
	}


讲Document写入到XML文件中

/**
	 * 讲Document写入到output.xml文件
	 * @param document
	 * @throws IOException
	 */
	public void wirte(Document document) throws IOException {
		//写一个没有格式的XML文件
		XMLWriter write = new XMLWriter(
				new FileWriter("/src/output.xml")
				);
		write.write(document);
		write.close();
		
		// 创建文件输出的时候,自动缩进的格式      
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
		
	
	}


Dom4j对于XML的操作大概就是这个样子,当然这个也是初步的了解Dom4j,当然还有JDom,SAX和java的代码都可以读取XML文件,只不过这个用起来感觉更方便,所以总结了一下。初学者,有问题希望指出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: