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>
相关文章推荐
- DOM、JDOM、DOM4J解析XML实例
- DOM、JDOM、DOM4J解析XML实例
- xml解析技术介绍(dom4j,dom,jdom,sax)
- DOM,SAX,JDOM,DOM4J优缺点比较及生产xml和解析xml
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- XML文档常用解析方式DOM、SAX、JDOM、DOM4J的比较
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
- XML中DOM,Sax,JDom,Dom4j解析的区别
- java解析xml方法:DOM解析、SAX解析、JDOM解析、DOM4J解析
- xml的解析方式——dom/sax、jdom、dom4j
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- DOM,SAX,JDOM,DOM4J 四种方式解析xml
- xml的四种解析方法 比较 sax,dom,jdom,dom4j
- xml生成、解析的四种方式,dom、sax、dom4j、jdom
- XML解析方式之DOM、SAX、JDOM、DOM4J
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- dom、SAX、Jdom、dom4j四种解析xml方式简单总结
- Java中四种XML解析技术对比(Dom、Sax、Dom4j JDom)
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j