您的位置:首页 > 其它

DOM、JDOM、DOM4J解析XML实例

2012-06-20 17:35 375 查看

http://ajuanlong.iteye.com/blog/1564355



一、DOM方式


原始name.xml

Html代码

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册>

<学生 性别="男">

<姓名>李华</姓名>

<年龄>14</年龄>

</学生>

<学生 性别="男">

<姓名>张三</姓名>

<年龄>16</年龄>

</学生>

<学生 性别="女">

<姓名>王娟</姓名>

<年龄>18</年龄>

</学生>

</学生花名册>

数据模型Student.java

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文档示例程序

Java代码

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

Java代码

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册>

<学生 性别="男">

<姓名>李华</姓名>

<年龄>14</年龄>

</学生>

<学生 性别="男">

<姓名>张三</姓名>

<年龄>16</年龄>

</学生>

</学生花名册>

name2.xml

Java代码

<?xml version="1.0" encoding="GB2312" standalone="no"?>

<学生花名册>

<学生 性别="男">

<姓名>李华</姓名>

<年龄>14</年龄>

</学生>

<学生 性别="男">

<姓名>张三</姓名>

<年龄>16</年龄>

</学生>

</学生花名册>


二、JDOM方式


HD.xml

Html代码

<?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文档示例

Html代码

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

Html代码

<?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示例

Java代码

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

Html代码

<?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

Html代码

<?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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: