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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
