dom4j解析XML

package com.dom4jdemo.test;java

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;node

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.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Namespace;apache

/**
 * 
 * Project: dom4jDemo
 * 
 * @title com.dom4jDemo.test.Test.java
 * @Description: dom4j解析xml的Deml類
 * @author 張宇佳
 * @created 2016年6月27日 下午1:53:15
 */
@SuppressWarnings("all")
public class Test {
    // ////////////////////////////////// XML文檔內容
    // /////////////////////////////////////////////////
    // <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    // <!DOCTYPE Books SYSTEM "books.dtd">
    // <Books>
    // <book id="a">
    // <title>How to Program in JAVA</title>
    // <author>James Green</author>
    // <price>20</price>
    // <publishHouse>清華大學出版社</publishHouse>
    // <description>是一本莫須有的書</description>
    // </book>
    // <book id="b">
    // <title>How to Program in C#</title>
    // <author>李逍遙</author>
    // <price>12</price>
    // <publishHouse>清華大學出版社</publishHouse>
    // <description>不存在這本書哦</description>
    // </book>
    // </Books>
    // /////////////////////////////////////////////////////////////////////////////////app

    /**
     * 
     * @TODO 解析Xml報文
     * @author 張宇佳
     * @created 2016年6月27日 下午1:53:55
     * @version 1.0.0
     */
    public static void parseXmlMsg() {
        StringBuffer sbf = new StringBuffer();
        sbf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
        sbf.append("<Books>");
        sbf.append("<book id=\"a\">");
        sbf.append("<title>How to Program in JAVA</title>");
        sbf.append("<author>James Green</author>");
        sbf.append("<price>20</price>");
        sbf.append("<publishHouse>清華大學出版社</publishHouse>");
        sbf.append("<description>是一本莫須有的書</description>");
        sbf.append("</book>");
        sbf.append("<book id=\"b\">");
        sbf.append("<title>How to Program in C#</title>");
        sbf.append("<author>李逍遙</author>");
        sbf.append("<price>12</price>");
        sbf.append("<publishHouse>清華大學出版社</publishHouse>");
        sbf.append("<description>不存在這本書哦</description>");
        sbf.append("</book>");
        sbf.append("</Books>");
        String xmlDocStr = sbf.toString(); // xml報文
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xmlDocStr); // 將xml報文轉換成xml文檔對象
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Element root = doc.getRootElement(); // 獲取根節點
        parseXml(root);
    }dom

    /**
     * 
     * @TODO 建立Xml文檔並解析
     * @author 張宇佳
     * @created 2016年6月27日 下午1:54:11
     * @version 1.0.0
     */
    public static void createDocument() {
        Document document = DocumentHelper.createDocument(); // 建立一個XML對象
        document.setXMLEncoding("utf-8");
        Element rootEle = DocumentHelper.createElement("ROOT"); // 建立根節點
        { // 添加根節點下的第一個子節點
            Element cEle = DocumentHelper.createElement("Book");
            cEle.setAttributeValue("id", "book1");
            // cEle.setText("123");
            { // 添加Book節點下的第一個子節點
                Element bookName = DocumentHelper.createElement("name");
                bookName.setText("Java");
                cEle.add(bookName);
            }測試

            { // 添加Book節點下的第二節點
                Element bookAuthor = DocumentHelper.createElement("author");
                bookAuthor.setText("做者EDG");
                cEle.add(bookAuthor);
            }spa

            {// ..........
                Element bookPrice = DocumentHelper.createElement("price");
                bookPrice.setText("25");
                cEle.add(bookPrice);
            }
            rootEle.add(cEle); // 添加節點
        }
        { // 添加第二個
            Element cEle = DocumentHelper.createElement("Book");
            cEle.setAttributeValue("id", "book2");
            // cEle.setText("123");
            { // 添加Book節點下的第一個子節點
                Element bookName = DocumentHelper.createElement("name");
                bookName.setText("Maven");
                cEle.add(bookName);
            }.net

            { // 添加Book節點下的第二節點
                Element bookAuthor = DocumentHelper.createElement("author");
                bookAuthor.setText("做者RNG");
                cEle.add(bookAuthor);
            }component

            {// ..........
                Element bookPrice = DocumentHelper.createElement("price");
                bookPrice.setText("160");
                cEle.add(bookPrice);
            }
            rootEle.add(cEle); // 添加節點
        }
        {// ............
            Element cEle = DocumentHelper.createElement("Book");
            cEle.setAttributeValue("id", "book3");
            // cEle.setText("123");
            { // 添加Book節點下的第一個子節點
                Element bookName = DocumentHelper.createElement("name");
                bookName.setText("dom4J");
                cEle.add(bookName);
            }orm

            { // 添加Book節點下的第二節點
                Element bookAuthor = DocumentHelper.createElement("author");
                bookAuthor.setAttributeValue("id", "author1");
                bookAuthor.setText("做者SHR");
                cEle.add(bookAuthor);
            }

            {// ..........
                Element bookPrice = DocumentHelper.createElement("price");
                bookPrice.setText("122");
                cEle.add(bookPrice);
            }
            rootEle.add(cEle); // 添加節點
        }
        document.add(rootEle);

        String xmlDocStr = document.asXML(); // 將xml文檔對象轉換成字符串對象
        System.err.println(xmlDocStr);

        System.err
                .println("--------------------------------------------------------------------");
        // document.selectNodes("");
        // xpath表達式 意爲 查找root元素下的book元素下的name元素 過濾 Book元素的屬性id值爲book1
        Node node = document.selectSingleNode("/ROOT/Book[@id='book1']/name");
        System.err.println(node.getText());
        System.err
                .println("--------------------------------------------------------------------");
        // xpath表達式 意爲 查找root元素下的Book元素 條件 Book元素下的price元素的text值大於80 若返回結果爲多個
        // 則返回第一個找到的Book對象,
        // 最後面的 .selectSingleNode 意爲 在找到的Book元素對象中查找price對象 , 返回找的第一個元素對象
        Node node1 = document.selectSingleNode("/ROOT/Book[price>80]")
                .selectSingleNode("price");
        System.err.println(node1.getText());

        System.out
                .println("----------------------------------------- 修改節點包含屬性id=book2的節點爲 id=abcd2 --------------------------------------");
        System.out.println("現文檔內容:");
        System.out.println(document.asXML());
        Element updateEle = getEleByAttr(rootEle, "id", "book2");
        Element updatedNode = updateAttr(updateEle, "id", "abcd2");
        System.out
                .println("---------------------------------------------修改後的文檔內容-------------------------------------------------------");
        System.out.println(document.asXML());
        System.out
                .println("------------------------------------ 開始測試移出節點 --------------------------------");
        System.out.println("XML原文檔內容:" + xmlDocStr);
        System.out.println("移出Root元素下Book元素下Price>100的第一個price元素節點");
        // Node bigNode =
        // document.selectSingleNode("/ROOT/Book[price>100]/price");
        Node bigNode = document.selectSingleNode("//Book[price>100]/price");
        // Node bigNode = document.selectSingleNode("//author[@id='author1']");
        System.out.println();
        bigNode.getParent().remove(bigNode); // 移出節點
        System.out.println("XML現文檔內容:" + document.asXML());

        System.out
                .println("-----------------------------------------------------將xml寫入xml文件中-------------------------------------------------");

        // OutputFormat of = OutputFormat.createCompactFormat(); // 緊湊格式 不排版縮進
        OutputFormat of = OutputFormat.createPrettyPrint(); // 縮進格式
        of.setEncoding("UTF-8"); // 文中含有中文 設置utf-8字節碼
        document.setXMLEncoding("UTF-8");
        File file = new File("D:\\JavaCreateDocument.xml");
        if (file.exists()) {
            file.delete(); // 若是文件已經存在 刪除它
        }
        XMLWriter out = null;
        try {
            out = new XMLWriter(new FileOutputStream(file), of);
            out.write(document);
            out.flush();
            out.close();
            System.out.println("文件生成成功!");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out
                .println("----------------------------------------讀取生成的XML文檔------------------------------------------");
        parseXmlFile("D:\\JavaCreateDocument.xml");
    }

    /**
     * 
     * @TODO 讀取解析Xml文件
     * @author 張宇佳
     * @created 2016年6月27日 下午1:54:26
     * @version 1.0.0
     */
    public static void parseXmlFile() {
        String filePath = "D:\\Books.xml"; // Xml文件路徑
        System.err.println("XML文檔路徑:" + filePath);
        SAXReader read = new SAXReader();// 獲取一個 文件讀取器
        File file = new File(filePath); // 建立一個文件對象
        Document doc = null;
        try {
            // 設置解析XML文檔時忽略DTD文件引用
            read.setFeature(
                    "http://apache.org/xml/features/nonvalidating/load-external-dtd",
                    false);
            // 獲取xml文檔對象
            doc = read.read(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Element root = doc.getRootElement(); // 獲取文檔的根節點
        parseXml(root);
    }

    /**
     * 
     * @TODO 讀取解析Xml文件
     * @author 張宇佳
     * @created 2016年6月27日 下午1:54:26
     * @version 1.0.0
     */
    public static void parseXmlFile(String filepath) {
        String filePath = "D:\\Books.xml"; // Xml文件路徑
        if (filepath != null && !filepath.equals("")) {
            filePath = filepath;
        }
        System.err.println("XML文檔路徑:" + filePath);
        SAXReader read = new SAXReader();// 獲取一個 文件讀取器
        File file = new File(filePath); // 建立一個文件對象
        Document doc = null;
        try {
            // 設置解析XML文檔時忽略DTD文件引用
            read.setFeature(
                    "http://apache.org/xml/features/nonvalidating/load-external-dtd",
                    false);
            // 獲取xml文檔對象
            doc = read.read(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out
                .println("---------------------------------------------文檔內容------------------------------------------------");
        System.out.println(doc.asXML());
        // Element root = doc.getRootElement(); // 獲取文檔的根節點
        // parseXml(root);
    }

    /**
     * 
     * @TODO 測試解析xml
     * @author 張宇佳
     * @created 2016年6月27日 下午3:15:33
     * @param root
     * @version 1.0.0
     */
    public static void parseXml(Element root) {
        Element element = root.element("book"); // 獲取root節點下的子節點
        Element elementTitle = element.element("title"); // 獲取element節點下的title節點
        Element ele = getEleByAttr(root, "id", "b"); // 根據id=b 獲取root節點下的子節點信息
        if (ele != null) { // 已經找到節點
            System.err.println("root節點下的具備id=b屬性的節點名字:" + ele.getName()
                    + "\n循環子節點:");
            Iterator it = ele.elementIterator();
            while (it.hasNext()) {
                Element e = (Element) it.next();
                System.out.println("節點的名字:" + e.getName());
                System.out.println("節點中的文字:" + e.getTextTrim());
                System.out.println();
            }
            System.out.println("修改id=b屬性的節點爲id=b1並循環該 遍歷同級別節點");

        } else {
            System.err.println("未找到節點信息");
        }
        System.err
                .println("------------------------------------------------------------------------");

        String nodeText = elementTitle.getTextTrim(); // 獲取節點的文字
        System.err.println("book節點的文字:" + nodeText);
        List rootChileNodeList = root.elements(); // 獲取某個節點下的子節點集合
        Iterator nodesIter = rootChileNodeList.iterator(); // 迭代器
        while (nodesIter.hasNext()) { // 遍歷
            Element node = (Element) nodesIter.next(); // 其中一個子節點
            String nodeTextStr = node.getTextTrim(); // 獲取節點內的文本 並去除兩側的空格
            System.err.println("根節點下的子節點包含的文本:" + nodeTextStr);
            String nodeName = node.getName(); // 獲取節點的名字
            System.err.println("根節點下的子節點名字:" + nodeName);
            String nodeAllText = node.getStringValue(); // 獲取節點下的全部String值
            System.err.println("根節點下的子節點中的全部String值:" + nodeAllText);
        }
    }

    /**
     * 
     * @TODO 根據屬性值獲取節點
     * @author 張宇佳
     * @created 2016年6月27日 下午2:44:26
     * @param node
     *            父節點
     * @param attrName
     *            屬性名字
     * @param attrValue
     *            屬性值
     * @return 找到的節點對象
     * @version 1.0.0
     */
    public static Element getEleByAttr(Element node, String attrName,
            String attrValue) {
        for (Iterator it = node.elementIterator(); it.hasNext();) { // 獲取節點的子節點迭代對象
            Element element = (Element) it.next();
            Attribute attribute = element.attribute(attrName); // 根據屬性的名字獲取屬性對象
                                                                // 值不爲null時表示找到這個屬性
                                                                // 不然爲未找到這個屬性
            if (attribute != null) {
                String value = attribute.getValue(); // 獲取屬性的值
                if (value != null && value.equals(attrValue)) {
                    return element;
                } else {
                    getEleByAttr(element, attrName, attrValue); // 當前節點列表中沒有找到
                                                                // 繼續深刻子節點查找
                }
            }
        }
        return null;
    }

    /**
     * 
     * @TODO 修改節點的屬性值
     * @author 張宇佳
     * @created 2016年6月28日 上午9:26:08
     * @param node
     *            要修改的元素節點
     * @param attrName
     *            節點屬性的名字
     * @param attrValue
     *            修改後的節點屬性值
     * @return 修改後的元素節點對象
     * @version 1.0.0
     */
    public static Element updateAttr(Element node, String attrName,
            String attrValue) {
        Iterator it = node.attributeIterator(); // 獲取node節點的全部屬性迭代器
        while (it.hasNext()) {
            Attribute attribute = (Attribute) it.next();
            String attrNameTempStr = attribute.getName(); // 獲取該屬性的名字
            if (attrNameTempStr != null && attrNameTempStr.equals(attrName)) { // 判斷是否和要修改的屬性名字同樣
                attribute.setValue(attrValue); // 設置屬性值
                return node;
            }
        }
        return null;
    }

    /***
     * 
     * @TODO dom4j+Xpath 測試示例 不帶命名空間
     * @author 張宇佳
     * @created 2016年6月29日 上午10:04:44
     * @version 1.0.0
     */
    public static void testXpath() {

    }

    /**
     * 
     * @TODO dom4j+Xpath 測試示例 帶命名空間
     * @author 張宇佳
     * @created 2016年6月29日 上午10:05:25
     * @version 1.0.0
     */

    public static void testXpathAndNamespace() throws Exception {
        SAXReader reader = new SAXReader();
        String filePath = "D:\\applicationContext.xml";
        File file= new File(filePath);
        Document doc = reader.read(file);
        Element rootNode = doc.getRootElement();
        Iterator childNodeIter = rootNode.elementIterator();
        System.out.println("-------循環根節點下的子節點");
        while(childNodeIter.hasNext()){
            Element childNode = (Element) childNodeIter.next();
            String nodeNameStr = childNode.getName(); // 獲取節點的名字
            String prefix = childNode.getNamespacePrefix(); // 獲取節點的命名空間前綴 
            String nodeTextStr = childNode.getTextTrim(); // 獲取節點內的文字
            Iterator childNodePropIter = childNode.attributeIterator();
            System.out.println("節點的名字:"+nodeNameStr+ (nodeTextStr.equals("")?"":",節點內的文字:"+nodeTextStr)+ ",節點的屬性:");
            System.out.println();
            while(childNodePropIter.hasNext()){
                Attribute attr = (Attribute) childNodePropIter.next();
                String attrName = attr.getName();
                String attrValue = attr.getValue();
                System.out.print(attrName+" = "+attrValue);
            }
            System.out.println();
        }
        System.out.println("-----------------------------------------------XPath獲取節點---------------------------------------------------");
        Map nsMap = new HashMap();
        List<Namespace> nsList = rootNode.declaredNamespaces(); // 返回這個文檔中聲明的所有命名空間
        for (Namespace namespace : nsList) {
            String nsKeyStr = namespace.getPrefix();  // 獲得命名空間的簡寫
            String nsValueStr = namespace.getURI();  // 獲得命名空間的URI
            if(nsKeyStr.equals("")){
                nsKeyStr = "ns" ; // 當命名空間的簡稱爲空時 設置爲ns
            }
            nsMap.put(nsKeyStr, nsValueStr);
        }
        reader.getDocumentFactory().setXPathNamespaceURIs(nsMap);
        Node propNode1 = rootNode.selectSingleNode("//context:component-scan");
        Node propNode = rootNode.selectSingleNode("//ns:property");
        String propNodeNameStr = propNode.getName();
        String propNodeTextStr = propNode.getText();
        Iterator propNodeAttrItor = ((Element)propNode).attributeIterator();
        System.out.println("屬性:");
        while(propNodeAttrItor.hasNext()){
            Attribute propNodeAttr = (Attribute) propNodeAttrItor.next();
            String attrName = propNodeAttr.getName();
            String attrValue = propNodeAttr.getValue();
            System.out.print(attrName + " = "+ attrValue + ",");
        }
        System.out.println("");
        
    }

    public static void main(String[] args) throws Exception{
         parseXmlFile();
         parseXmlMsg();
        createDocument();
        testXpathAndNamespace();
    }

}

示例代碼:


360雲盤 https://yunpan.cn/ckrhe9VDjXy6p  訪問密碼:f9d5

相關文章
相關標籤/搜索