一、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>