java項目概覽:
XmlManage.java
package com.jialin;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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;
/**
* 測試DOM4J創建,修改,遍歷XML
*
* @author jialin
*
*/
public class XmlManager {
public static void main(String[] args) {
XmlManager xmlManager = new XmlManager();
// 初始化xml文檔
Document doc = null;
// 通過dom4j方法創建xml
// doc = xmlManager.createXml();
// XML字符串
// String strXMl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
// + "<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>"
// + "<students><!--Students Table--> <student stu=\"001\">"
// + "<name>張三</name><age>18</age></student><student stu=\"002\">"
// + "<name>李四</name><age>19</age></student></students>";
// 通過字符串創建xml
// doc = xmlManager.createDocumentByString(strXMl);
// XMl輸出路徑
// String outputPath = "xml/Students.xml";
// 輸出xml
// xmlManager.saveDocument(doc, outputPath);
// xml輸入路徑
String inputPath = "xml/Students.xml";
// 根據xml路徑更改XML
//xmlManager.ModifyXml(inputPath);
// 根據xml路徑獲取doc
doc = xmlManager.getDocument(inputPath);
// 遍歷XML
xmlManager.traversalDocumentByElementIterator(doc);
// xmlManager.traversalDocumentByVisitor(doc);
//xmlManager.traversalDocumentByElements(doc);
//xmlManager.traversalDocumentByselectNodes(doc, "/Students/student/name");
}
/**
* 獲取XML文件
* @param inputPath
* @return
*/
public Document getDocument(String inputPath) {
// 輸入文件
File inputXml = new File(inputPath);
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(inputXml);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 通過Dom4j方法創建xml文檔
*
* @return
*/
public Document createXml() {
Document doc = DocumentHelper.createDocument();
// 創建ProcessingInstruction
Map<String, String> inMap = new HashMap<String, String>();
inMap.put("type", "text/xsl");
inMap.put("href", "students.xsl");
doc.addProcessingInstruction("xml-stylesheet", inMap);
// 增加根節點
Element studentsElement = doc.addElement("Students");
// 增加注釋
studentsElement.addComment("Students Table");
// 增加子節點
Element stuElement = studentsElement.addElement("student");
// 增加屬性
stuElement.addAttribute("stu", "001");
// 增加名稱節點
Element nameElement = stuElement.addElement("name");
// 設置名稱節點的值
nameElement.setText("張三");
// 增加年齡節點
Element ageElement = stuElement.addElement("age");
// 設置年齡節點的值
ageElement.setText("18");
// 同上
Element anotherStuElement = studentsElement.addElement("student");
anotherStuElement.addAttribute("stu", "002");
Element anotherNameElement = anotherStuElement.addElement("name");
anotherNameElement.setText("李四");
Element anotherAgeElement = anotherStuElement.addElement("age");
anotherAgeElement.setText("19");
return doc;
}
/**
* 通過字符串創建xml文檔
* @param xmlStr
* @return
*/
public Document createDocumentByString(String xmlStr) {
Document doc = null;
try {
// 通過字符串轉換直接構建xml文檔
doc = DocumentHelper.parseText(xmlStr);
} catch (DocumentException e) {
e.printStackTrace();
}
return doc;
}
/**
* 修改xml
*
* @param inputXmlPath
*/
public void ModifyXml(String inputXmlPath) {
// 獲取文件
File inputXml = new File(inputXmlPath);
try {
SAXReader saxReader = new SAXReader();
// 創建document
Document doc = saxReader.read(inputXml);
// 讀取Students/student下所有具有屬性stu的元素
List list = doc.selectNodes("/Students/student/@stu");
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("001"))
attribute.setValue("0001");
}
list = doc.selectNodes("/Students/student");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("name");
while (iterator.hasNext()) {
Element nameElement = (Element) iterator.next();
if (nameElement.getText().equals("張三"))
nameElement.setText("王五");
}
}
String outputPath = "xml/Students-Modified.xml";
saveDocument(doc, outputPath);
}
catch (DocumentException e) {
System.out.println(e.getMessage());
}
}
/**
* 將文檔輸出到文件保存,可指定格式化輸出,可指定字符編碼。
*
* @param document
* @param outputFile
*/
public void saveDocument(Document doc, String outputPath) {
// 輸出文件
File outputFile = new File(outputPath);
try {
// 美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML編碼,不指定的話,默認為UTF-8
format.setEncoding("UTF-8");
XMLWriter output = new XMLWriter(new FileWriter(outputFile), format);
output.write(doc);
output.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
/**
* 普通方法遍歷xml
*
* @param doc
*/
public void traversalDocumentByElementIterator(Document doc) {
// 獲取根節點
Element root = doc.getRootElement();
// 枚舉根節點下所有子節點
for (Iterator ie = root.elementIterator(); ie.hasNext();) {
System.out.println("======");
Element element = (Element) ie.next();
System.out.println(element.getName());
// 枚舉屬性
for (Iterator ia = element.attributeIterator(); ia.hasNext();) {
Attribute attribute = (Attribute) ia.next();
System.out.println(attribute.getName() + ":"
+ attribute.getData());
}
// 枚舉當前節點下所有子節點
for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {
Element elementSon = (Element) ieson.next();
System.out.println(elementSon.getName() + ":"
+ elementSon.getText());
}
}
}
/**
* 使用elements方法進行xml的讀取,相當于條件查詢,可以根據不同的節點,利用for循環查詢該節點下所有的數據。
*
* @throws DocumentException
*/
public static void traversalDocumentByElements(Document doc) {
// 獲取根節點
Element root = doc.getRootElement();
// 根據根節點,將根節點下 student中的所有數據放到list容器中。
List list = root.elements("student");
// 這種遍歷方式,是jdk1.5以上的版本支持的遍歷方式,嘿嘿試試
for (Object obj : list) {
Element el = (Element) obj;
System.out.println("----------"+el.getName()+"-----------");
// 獲取name節點下所有的內容,存入listName容器中
List listName = el.elements("name");
// 獲取age節點下所有的內容,存入age容器中
List listAge = el.elements("age");
for (int i=0;i<listName.size();i++) {
Element elname = (Element) listName.get(i);
// 獲取name節點下的數據。
System.out.println(elname.getName() + ": " + elname.getText());
Element elage = (Element) listAge.get(i);
// 獲取age節點下的數據。
System.out.println(elage.getName() + ": " + elage.getText());
}
}
}
/**
* 使用selectNodes讀取xml文件
*
* @param args
* @throws DocumentException
*/
public static void traversalDocumentByselectNodes(Document doc,
String elementpath) {
// 使用selectNodes獲取所要查詢xml的節點。
List list = doc.selectNodes(elementpath);
// 遍歷節點,獲取節點內數據。
for (Iterator ie = list.iterator(); ie.hasNext();) {
Element el = (Element) ie.next();
System.out.println(el.getName() + ": " + el.getText());
}
}
/**
* 基于訪問者模式遍歷
*
* @param doc
*/
public void traversalDocumentByVisitor(Document doc) {
doc.accept(new MyVisitor());
}
}
MyVisitor.java
package com.jialin;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
/**
* 定義自己的訪問者類
*/
public class MyVisitor extends VisitorSupport {
/**
* 對于屬性節點,打印屬性的名字和值
*/
public void visit(Attribute node) {
System.out.println("attribute : " + node.getName() + " = "
+ node.getValue());
}
/**
* 對于處理指令節點,打印處理指令目標和數據
*/
public void visit(ProcessingInstruction node) {
System.out.println("PI : " + node.getTarget() + " "
+ node.getText());
}
/**
* 對于元素節點
* 如果包含文本內容,則打印元素的名字和元素的內容。如果不是,則只打印元素的名字
*/
public void visit(Element node) {
if (node.isTextOnly())
System.out.println("element : " + node.getName() + " = "
+ node.getText());
else
System.out.println("《《《《《《" + node.getName() + "》》》》》》");
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

