Java操作XML文件

Java操作XML文件常用的有四種方式:Dom,JDom,Sax以及Dom4j。
Dom解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)。
JDom是基於樹的處理XML的Java API,把樹加載在內存中,不能處理大於內存的文檔。針對實例文檔不提供DTD與模式的任何實際模型。
Sax中,當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,佔用資源少;SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬於哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少。
DOM4J 性能優異、功能強大、極易使用,JVM中解析XML的操作也是以此爲基礎的。
本文以Dom4j爲例介紹如何操作Xml文件。要使用Dom4j,請先去網上下載一個Dom4j的jar包。示例代碼如下所示:
package com.test.xml;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
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.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jDemo implements XmlDocument {

public void createXml(String fileName) {
//創建文檔對象
Document document = DocumentHelper.createDocument();
//添加元素,第一個元素爲根元素
Element employees = document.addElement("employees");
//在根元素下添加其它元素
Element employee = employees.addElement("employee");
//爲元素添加數據(第一個參數爲屬性名稱,第二個參數爲屬性值)
employee.addAttribute("dept", "sale");

Element name = employee.addElement("name");
//設置該元素的文本值
name.setText("andrew");

Element sex = employee.addElement("sex");
sex.setText("m");

Element age = employee.addElement("age");
age.setText("29");

try {
//創建寫XML文檔的Writer對象
Writer fileWriter = new FileWriter(fileName);
//創建美化文檔的format對象,如果沒有這個對象,生成的XML文檔的元素不會換行,不太美觀
OutputFormat format = OutputFormat.createPrettyPrint(); 
XMLWriter xmlWriter = new XMLWriter(fileWriter, format);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public void parserXml(String fileName) {
File inputXml = new File(fileName);
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(inputXml);
//獲取文檔的根元素
Element employees = document.getRootElement();

parseElement(employees);
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j parserXml");
}


@SuppressWarnings("unchecked")
private void parseElement(Element element) {
System.out.println("元素名:" + element.getName());

//獲得該元素的所有屬性
List attributes = element.attributes();
for (int i = 0; i < attributes.size(); i++) {
Attribute arrribute = (Attribute)attributes.get(i);
//獲得屬性名
String name = arrribute.getName();
//獲得屬性值
String value = arrribute.getValue();
System.out.println("屬性" + name + "的值:" + value);
}

//獲得元素的文本的值,並且去掉空格
String text = element.getTextTrim();
if (text != null && text.length() > 0) {
System.out.println("元素的文本值:" + text);
}

//獲得元素下的所有子元素,遞歸調用以獲取子元素下的屬性及元素信息
List childElements = element.elements();
for (int i = 0; i < childElements.size(); i++) {
Element childElement = (Element)childElements.get(i);
parseElement(childElement);
}
}

public static void main(String[] args) {
Dom4jDemo demo = new Dom4jDemo();
String fileName1 = Dom4jDemo.class.getResource("example.xml").getPath();
demo.parserXml(fileName1);
String fileName2 = Dom4jDemo.class.getResource("").getPath() + "example3.xml";
demo.createXml(fileName2);
}
}
示例程序中解析的example.xml文件的內容如下所示:
<?xml version="1.0" encoding="UTF-8"?> 
<employees>
<employee id="F2300982" groupName="Theam1"> 
<name oldName="zhangliang">andrew</name> 
<sex>M</sex> 
<age>30</age> 
</employee> 
</employees>
示例程序中創建的example3.xml文件的內容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
 <employee dept="sale">
 <name>andrew</name>
 <sex>m</sex>
 <age>29</age>
 </employee>
</employees>
這裏的代碼僅僅示範了一下用Dom4j解析和創建XML文檔的基本功能,Dom4j還有許多其它的功能,有待於研究。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章