XML第二十一讲:JDOM 与 DOM4J 综合使用

  上一讲我们学习了如何使用dom4j来生成xml文档,并且输出,现在我们来学习一下如何使用dom4j来对已有的XML进行解析.

1. 解析下面的XML文档,student3.xml

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

<student name="zhangsan">
    <hello age="20">world</hello>
    <hello age="30">world</hello>
    <world/>
</student>

解析代码如下:

package com.ahuier.dom4j;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.SAXReader;

/*
 * 使用两种方式来读取XML文档:SAXReader 和 DOMReader
 */
public class Test2 {
	
	public static void main(String[] args) throws Exception {
		
		/*
		 * 首先使用SAXReader读取xml文档
		 */
		
		SAXReader saxReader = new SAXReader();
		//获得Document对象,得到解析xml文档的路口
		Document doc = saxReader.read(new File("student3.xml"));
		
		//获得根元素节点
		Element root = doc.getRootElement();
		
		System.out.println("root element: " + root.getName());
		

		 /*
		  *  获取root下面所有的子元素:hello 和 world
		  */

		// -------------------------------- 第一种方式获取给定元素的子元素-------
		List childList = root.elements();
		
		System.out.println(childList.size());
		
		//得到以 "hello"作为子元素名的所有元素
		List childList2 = root.elements("hello");
		System.out.println(childList2.size());
		
		//返回以hello元素为标签名的第一个元素
		Element first = root.element("hello");
		System.out.println(first.attributeValue("age")); //打印出特定属性 age 属性值
		
		System.out.println("----------- 使用迭代来获取给定元素的子元素 --------------");
		
		//推荐使用,只需要通过元素就可以获取到它的子元素
		for(Iterator iter = root.elementIterator(); iter.hasNext();){
			Element e = (Element)iter.next();
			System.out.println(e.attributeValue("age"));
		}
		
		System.out.println("------使用DOMReader来获取XML文档----------------------");
		
		
		/*
		 * 使用DOMReader方法来获取XML文档
		 * 注意方法: public Document read(Document domDocument) 中接收的参数 domDocument 是在org.w3c.dom包中的
		 * 所以这里面的 domDocument 是JAXP的Document对象,要经过工厂方式获得然后通过这个read()方法转化为dom4j的Document对象
		 */
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		//在一个文件里面使用了两个相同的类,但是位于不同的包下,所以这边必须加上包的路径
		org.w3c.dom.Document document = db.parse(new File("student3.xml"));
		
		//将JAXP的Document对象转化为dom4j的Document对象
		DOMReader domReader = new DOMReader();
		Document d = domReader.read(document);
		
		Element rootElement = d.getRootElement();
		System.out.println(rootElement.getName());
		
	}

}

[编译执行结果]:

root element: student
3
2
20
----------- 使用迭代来获取给定元素的子元素 --------------
20
30
null
------使用DOMReader来获取XML文档----------------------
student

2. 使用JDOM来构造以下XML文档,并将其输出至硬盘

<?xml version="1.0" encoding="gbk"?>
<联系人列表 公司="A集团">
	<联系人>
		<姓名>张三</姓名>
		<公司>A公司</公司>
		<电话>(021)5555666</电话>
		<地址>
			<街道>5街</街道>
			<城市>上海</城市>
			<省份>上海</省份>
		</地址>
	</联系人>
</联系人列表>
解析代码如下:

package com.ahuier.jdom;

import java.io.FileWriter;
import java.io.IOException;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class Test3 {

	public static void main(String[] args) throws Exception {

		Document document = new Document();
		Element root = new Element("联系人列表").setAttribute(new Attribute("公司",
				"A集团"));

		document.addContent(root);

		Element contactPerson = new Element("联系人");
		root.addContent(contactPerson);

		contactPerson
				.addContent(new Element("姓名").setText("张三"))
				.addContent(new Element("公司").setText("A公司"))
				.addContent(new Element("电话").setText("(021)5555666"))
				.addContent(
						new Element("地址")
								.addContent(new Element("街道").setText("5街"))
								.addContent(new Element("城市").setText("上海"))
								.addContent(new Element("省份").setText("上海")));
		XMLOutputter output = new XMLOutputter(Format.getPrettyFormat()
				.setIndent("    ").setEncoding("gbk"));
		output.output(document, new FileWriter("contacts.xml"));
	}
}
[编译执行生成contacts.xml如下]:

<?xml version="1.0" encoding="gbk"?>
<联系人列表 公司="A集团">
    <联系人>
        <姓名>张三</姓名>
        <公司>A公司</公司>
        <电话>(021)5555666</电话>
        <地址>
            <街道>5街</街道>
            <城市>上海</城市>
            <省份>上海</省份>
        </地址>
    </联系人>
</联系人列表>


[说明]:自此XML解析就告一段落了,XML解析总共写了20讲,读者在学习的时候可以从XML第一讲开始学习,后续我会整理出XML整个系列学习笔记。在此,特别感谢 风中叶_张龙老师,整个系列的文档都是基于他的XML视频改编而成,算是我的学习笔记吧。




你可能感兴趣的:(xml,sax,jdom,dom,dom4j)