DOM、JDOM、DOM4J解析XML实例

一、DOM方式

原始name.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册>
	<学生 性别="男">
		<姓名>李华</姓名>
		<年龄>14</年龄>
	</学生>
	<学生 性别="男">
		<姓名>张三</姓名>
		<年龄>16</年龄>
	</学生>
	<学生 性别="女">
		<姓名>王娟</姓名>
		<年龄>18</年龄>
	</学生>
</学生花名册>

数据模型Student.java

package com.upcgrid.dom;

public class Student {
	private String name;
	private String sex;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

DOM方式解析xml文档示例程序

package com.upcgrid.dom;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

/**
 * 
 * @author shijin 原始DOM解析XML方式
 * 
 */
public class DOMTest {
	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException, TransformerException {
		DOMTest test = new DOMTest();
		test.deleteElement("name.xml", "女");
		Vector<Student> stus = test.changeXMLToModel("name.xml");
		for (Student stu : stus) {
			System.out.print(stu.getName() + " " + stu.getSex() + " "
					+ stu.getAge() + "\n");
		}
		// 输出:
		// 李华 男 14
		// 张三 男 16
		test.createDocument("name2.xml", stus);
	}

	/**
	 * show 根据vector中的student对象创建xml文档
	 * 
	 * @param filename
	 *            要创建的文档名
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 * @throws TransformerException
	 */
	public void createDocument(String filename, Vector<Student> stus)
			throws ParserConfigurationException, SAXException, IOException,
			TransformerException {
		// 得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 从DOM工厂获取DOM解析器
		DocumentBuilder builder = dbf.newDocumentBuilder();
		// 创建document对象
		Document doc = builder.newDocument();
		Element root = doc.createElement("学生花名册");// 创建根元素
		doc.appendChild(root);// 添加根元素
		for (Student stu : stus) {
			Element stuElement = doc.createElement("学生");
			stuElement.setAttribute("性别", stu.getSex());
			Element nameElement = doc.createElement("姓名");
			Text nameText = doc.createTextNode(stu.getName());
			nameElement.appendChild(nameText);
			Element ageElement = doc.createElement("年龄");
			Text ageText = doc.createTextNode(String.valueOf(stu.getAge()));
			ageElement.appendChild(ageText);
			stuElement.appendChild(nameElement);
			stuElement.appendChild(ageElement);
			root.appendChild(stuElement);
		}
		FileOutputStream fos = new FileOutputStream(filename);
		OutputStreamWriter ow = new OutputStreamWriter(fos);
		// 保存xml文件
		DOMSource doms = new DOMSource(doc);
		// 创建结果输出流
		StreamResult result = new StreamResult(ow);
		// 得到转换工厂实例
		TransformerFactory transFac = TransformerFactory.newInstance();
		// 得到转换器实例
		Transformer trans = transFac.newTransformer();
		// 转化器设置输出文档的编码方式
		trans.setOutputProperty(OutputKeys.ENCODING, "GB2312");
		//设置支持缩进
		trans.setOutputProperty(OutputKeys.INDENT, "yes");
		// 将文档源转换到结果输出流
		trans.transform(doms, result);
	}

	/**
	 * show 读取指定XML文档并将其对象化
	 * 
	 * @param filename
	 * @return 存储Student对象的vector
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public Vector<Student> changeXMLToModel(String filename)
			throws ParserConfigurationException, SAXException, IOException {
		// 得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 从DOM工厂获取DOM解析器
		DocumentBuilder builder = dbf.newDocumentBuilder();
		// 解析xml文档,获得document对象,即DOM树
		Document doc = builder.parse(filename);
		// 获取根节点
		Element root = doc.getDocumentElement();
		// 获取根节点的子节点中名字为"学生"的节点列表
		NodeList stuNodes = root.getElementsByTagName("学生");
		Vector<Student> students = new Vector<Student>();
		// 遍历<学生>节点
		for (int i = 0; i < stuNodes.getLength(); i++) {
			// 获取一个学生节点
			Element stuNode = (Element) stuNodes.item(i);
			// 创建一个学生对象
			Student stu = new Student();
			stu.setSex(stuNode.getAttribute("性别"));
			// 获取<学生>节点的子节点中名字为"姓名"的节点列表
			NodeList nameNodes = stuNode.getElementsByTagName("姓名");
			// 取得第一个姓名
			Element nameNode = (Element) nameNodes.item(0);
			stu.setName(nameNode.getTextContent());
			// 获取<学生>节点的子节点中名字为"年龄"的节点列表
			NodeList ageNodes = stuNode.getElementsByTagName("年龄");
			// 取得第一个年龄
			Element ageNode = (Element) ageNodes.item(0);
			stu.setAge(Integer.parseInt(ageNode.getTextContent()));
			students.add(stu);
		}
		return students;
	}

	/**
	 * show 删除指定名为filename的xml文档中学生结点的性别属性为tagname的结点
	 * 
	 * @param filename
	 * @param tagname
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 * @throws TransformerException
	 */
	public void deleteElement(String filename, String tagname)
			throws ParserConfigurationException, SAXException, IOException,
			TransformerException {
		// 得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 从DOM工厂获取DOM解析器
		DocumentBuilder builder = dbf.newDocumentBuilder();
		// 解析xml文档,获得document对象,即DOM树
		Document doc = builder.parse(filename);
		// 找到删除节点
		NodeList stuNodes = doc.getElementsByTagName("学生");
		for (int i = 0; i < stuNodes.getLength(); i++) {
			Element stuElement = (Element) stuNodes.item(i);
			String sex = stuElement.getAttribute("性别");
			if (sex.equals(tagname)) {
				stuElement.getParentNode().removeChild(stuElement);
			}
		}
		// 保存xml文件
		DOMSource doms = new DOMSource(doc);
		// 创建结果输出流
		StreamResult result = new StreamResult(new FileOutputStream(filename));
		// 得到转换工厂实例
		TransformerFactory transFac = TransformerFactory.newInstance();
		// 得到转换器实例
		Transformer trans = transFac.newTransformer();
		// 转化器设置输出文档的编码方式
		trans.setOutputProperty(OutputKeys.ENCODING, "GB2312");
		// 将文档源转换到结果输出流
		trans.transform(doms, result);
	}
}

输出:
李华 男 14
张三 男 16
结果name.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册>
	<学生 性别="男">
		<姓名>李华</姓名>
		<年龄>14</年龄>
	</学生>
	<学生 性别="男">
		<姓名>张三</姓名>
		<年龄>16</年龄>
	</学生>
	
</学生花名册>

name2.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?>
<学生花名册>
<学生 性别="男">
<姓名>李华</姓名>
<年龄>14</年龄>
</学生>
<学生 性别="男">
<姓名>张三</姓名>
<年龄>16</年龄>
</学生>
</学生花名册>
二、JDOM方式

HD.xml

<?xml version="1.0" encoding="UTF-8"?>
<HD>
  <disk name="C">
    <capacity>8G</capacity>
    <directories>200</directories>
    <files>1580</files>
  </disk>

  <disk name="D">
    <capacity>10G</capacity>
    <directories>500</directories>
    <files>3000</files>
  </disk>
</HD> 

JDOM解析XML文档示例

package com.upcgrid.jdom;

import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class JDOMTest {
	public static void main(String[] args) throws JDOMException, IOException {
		// 获得JDOM以SAX方式处理XML文档的构造器
		SAXBuilder saxb = new SAXBuilder();
		// 通过SAX构造器获得XML文档对象
		Document doc = saxb.build(JDOMTest.class.getClassLoader()
				.getResourceAsStream("test.xml"));
		// 获取根元素HD
		Element root = doc.getRootElement();
		// 取名字为disk的所有元素
		List<Element> list = root.getChildren("disk");
		for (int i = 0; i < list.size(); i++) {
			//取得第i个disk节点
			Element diskElement = (Element) list.get(i);
			//取得disk属性name
			String name = diskElement.getAttributeValue("name");
			// 取disk子元素capacity的内容
			String capacity = diskElement.getChildText("capacity");
			String directories = diskElement.getChildText("directories");
			String files = diskElement.getChildText("files");
			System.out.println("磁盘信息:");
			System.out.println("分区盘符:" + name);
			System.out.println("分区容量:" + capacity);
			System.out.println("目录数:" + directories);
			System.out.println("文件数:" + files);
			System.out.println("-----------------------------------");
		}
	}
}

输出结果:
磁盘信息:
分区盘符:C
分区容量:8G
目录数:200
文件数:1580
-----------------------------------
磁盘信息:
分区盘符:D
分区容量:10G
目录数:500
文件数:3000
-----------------------------------

三、DOM4J方式

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
	<class name="com.upcgrid.User" table="t_user">
		<property name="username">aaa</property>
		<property name="password">bbb</property>
	</class>>
</hibernate-mapping>

DOM4J解析XML示例

package com.upcgrid.dom4j;

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DOM4JTest {
	public static void main(String[] args) {
		//获得DOM4J以SAX方式处理XML文档的管道
		SAXReader reader = new SAXReader();
		try {
			//通过管道获得XML文档对象
			Document document = reader.read(new File("User.hbm.xml"));
			//获取根节点
			Element root = document.getRootElement();
			System.out.println(root.getName());
			
			Element element = null;
			//遍历根节点下的节点
			for(Iterator<Element> i = root.elementIterator();i.hasNext();){
				//根节点的子节点
				element = (Element) i.next();
				System.out.println(element.getName());
				//遍历节点属性
				for(Iterator<Attribute> j = element.attributeIterator();j.hasNext();){
					Attribute attr = (Attribute)j.next();
					System.out.println(attr.getName()+":"+attr.getValue());
				}
				//遍历名为"property"的节点
				for(Iterator<Element> k = element.elementIterator("property");k.hasNext();){
					Element e1 = (Element)k.next();
					System.out.println(e1.getData());
				}
			}
			
			//通过Xpath的方式寻找节点
			List<Node> list = document.selectNodes("//hibernate-mapping/class/property");
			for(Node n: list){
				String name = n.valueOf("@name");
				System.out.println(n.getName()+" @name:"+name);
			}
			//只拿第一个
			Node node = document.selectSingleNode("//hibernate-mapping/class");
			String name = node.valueOf("@name");
			String table = node.valueOf("@table");
			System.out.println(node.getName()+" @name:"+name+",@table:"+table);
			createDocument();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	public static Document createDocument(){
		//创建document对象
		Document document = DocumentHelper.createDocument();
		Element root = document.addElement("hibernate-mapping");
		//链式编程
		Element classElement = root.addElement("class")
			.addAttribute("name", "com.upcgrid.User")
			.addAttribute("table", "t_user");
		classElement.addElement("property").addAttribute("name", "username").addText("aaa");
		classElement.addElement("Property").addAttribute("name", "password").addText("bbb");;
		try {
			FileWriter out = new FileWriter("User1.hbm.xml");
			document.write(out);
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			//设定美化格式
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(new FileWriter("User2.hbm.xml"),format);
			writer.write(document);
			writer.close();
			//缩减格式
		} catch (IOException e) {
			e.printStackTrace();
		}
		return document;
	}
}

输出:
hibernate-mapping
class
name:com.upcgrid.User
table:t_user
aaa
bbb
property @name:username
property @name:password
class @name:com.upcgrid.User,@table:t_user
User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping><class name="com.upcgrid.User" table="t_user"><property name="username">aaa</property><Property name="password">bbb</Property></class></hibernate-mapping>

User2.hbm.xml

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

<hibernate-mapping>
  <class name="com.upcgrid.User" table="t_user">
    <property name="username">aaa</property>
    <Property name="password">bbb</Property>
  </class>
</hibernate-mapping>

你可能感兴趣的:(xml,String,table,文档,encoding,disk)