dom4j操做xml

 目前接觸到的關於xml的主要有方面:html

  一、xml做爲項目的配置文件,項目初始化時讀取裏邊的內容。從系統方面考慮,在項目不重啓的狀況下要有修改從新載入配置的功能,此時須要對xml內容進行操做,java

       若是是一個大系統須要各個系統之間進行通訊,通知各個服務器進行從新載入。node

  二、通訊時傳遞的報文爲xml格式,常見於webservice,此時接收或者傳遞報文時須要和bean相互轉換。web

  第一種狀況,最流行的是dom4j,使用方便,代碼簡練,不用再封裝工具類,性能最好。服務器

  第二種狀況,能夠使用jaxb解析,封裝一個工具類就能夠實現xml與bean的相互轉化。框架

  這裏寫一下dom4j的使用,jaxb使用方法請點擊  jaxb實現xml與bean的相互轉化 。dom

 ①  test.xml工具

<?xml version="1.0" encoding="UTF-8"?>
<orgs size="7095" batch_number="20130704110039" errmsg="錯誤信息">
    <org>
        <org_id>16817</org_id>
        <parent_id>9233</parent_id>
        <org_name>512AAS.蘇州滄浪區</org_name>
        <org_code>512AAS</org_code>
        <org_type>門店部門1</org_type>
        <start_d>2011-12-28</start_d>
        <end_d>2011-12-29</end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-4 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16818</org_id>
        <parent_id>9234</parent_id>
        <org_name>513AAS.蘇州滄浪區</org_name>
        <org_code>513AAS</org_code>
        <org_type>門店部門2</org_type>
        <start_d>2011-12-18</start_d>
        <end_d>2011-12-19</end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-5 10:32:09</insert_t>
    </org>
    <org>
        <org_id>16819</org_id>
        <parent_id>9235</parent_id>
        <org_name>514AAS.蘇州滄浪區</org_name>
        <org_code>514AAS</org_code>
        <org_type>門店部門3</org_type>
        <start_d>2011-12-08</start_d>
        <end_d>2011-12-09</end_d>
        <attribute1></attribute1>
        <insert_t>2013-7-6 10:32:09</insert_t>
    </org>
</orgs>
/**
 * dom4j的代碼已經很簡單易懂了,不須要本身再封裝工具類了 
 * DOM4J是 dom4j.org 出品的一個開源 XML 解析包。
 * DOM4J應用於 Java 平臺,採用了 Java 集合框架並徹底支持 DOM,SAX 和 JAXP。
 * @author cxz
 */
public class dom4j {
    public static void main(String[] args) {
        try {   
            //手動建立
            Document document = DocumentHelper.createDocument();//建立doc對象  
            Element roott = document.addElement("csdn");//建立csdn根節點
            
            //讀取xml文件爲doc對象
            String path = "D:\\test.xml";
            File file = new File(path);
            SAXReader reader = new SAXReader();                
            Document doc = reader.read(file);   
            
            //將整個xml轉換爲string
            String testxml = doc.asXML();
            
            //將String轉換爲doc對象
            doc = DocumentHelper.parseText(testxml);
            
            //讀取根節點
            Element root = doc.getRootElement(); 
            
            //讀取此節點下的子節點
            Element org=root.element("org");
            Element orgId = org.element("org_id");
            //沒有子節點的節點才能讀取到text
            String s = orgId.getText();
            System.out.println(s);
            
            //讀取某節點下全部的名字爲**的子節點,遍歷
            List<Element> nodes = root.elements("org");
            for(Element e : nodes){
                Element orgid = e.element("org_id");
                System.out.println(orgid.getText());
            }
            
            //讀取某節點下的全部子節點
            List<Element> es = root.elements();//獲得5個orgs
            
            //在某節點下添加子節點  
            Element elm = root.addElement("朝代");  
            //設置節點文字
            elm.setText("明朝");  
            //刪除某節點
            //childElement是待刪除的節點,parentElement是其父節點  
            root.remove(org);
            //添加一個CDATA節點
            Element contentElm = root.addElement("content");
            contentElm.addCDATA("cdata區域");  

            //獲取節點屬性
            Attribute attribute=root.attribute("batch_number"); 
            String batch_number = attribute.getText();
            
            //刪除某屬性
            Attribute attribute1=root.attribute("errmsg");
            root.remove(attribute1);  
            
            //遍歷節點屬性值 
            for(Iterator it=root.attributeIterator();it.hasNext();){        
                   Attribute attribute2 = (Attribute) it.next();          
                   String text=attribute2.getText();        
                   System.out.println(text);
            }  
            
            //寫入xml            
            //無中文
            XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));  
            writer.write(document); 
            writer.close(); 
            
            //有中文
            // 緊湊的格式  
//            OutputFormat format = OutputFormat.createCompactFormat();  
            // 縮緊格式
            OutputFormat format = OutputFormat.createPrettyPrint();// 建立文件輸出的時候,自動縮進的格式                    
            format.setEncoding("UTF-8");//設置編碼  
//            XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
            XMLWriter xmlwriter = new XMLWriter(new OutputStreamWriter(  
                    new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);
            xmlwriter.write(document);  
            xmlwriter.flush();
            xmlwriter.close();             
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }
}

項目中的實際運用,項目啓動類中的初始化xmlpost

這裏有一個獲取jar包路徑的工具類,以下:性能

/**
 * 路徑通用類
 * @author 李冬
 * 說明:
 */
public class JarUtil {
    private String jarName;
    private String jarPath;

    public JarUtil(Class<?> clazz) {
        //獲這個文件到他的bin路徑
        String path = clazz.getProtectionDomain().getCodeSource().getLocation().getFile();
    
        try {
            path = java.net.URLDecoder.decode(path, "UTF-8");
            
        } catch (java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        java.io.File jarFile = new java.io.File(path);
        this.jarName = jarFile.getName();

        java.io.File parent = jarFile.getParentFile();
        if (parent != null) {
            this.jarPath = parent.getAbsolutePath();
        }
    }

    /**
     * 獲取Class類所在Jar包的名稱
     * 
     * @return Jar包名 (例如:C:\temp\demo.jar 則返回 demo.jar )
     */
    public String getJarName() {
        try {
            
            return java.net.URLDecoder.decode(this.jarName, "UTF-8");
        } catch (java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 取得Class類所在的Jar包路徑
     * 
     * @return 返回一個路徑 (例如:C:\temp\demo.jar 則返回 C:\temp )
     */
    public String getJarPath() {
        try {
            return java.net.URLDecoder.decode(this.jarPath, "UTF-8");
        } catch (java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        JarUtil ju = new JarUtil(JarUtil.class);
        System.out.println("Jar name: " + ju.getJarName());
        System.out.println("Jar path: " + ju.getJarPath());
    }
}
public void initConf() throws Exception {
        logger.info(">>>配置系統信息...開始讀取配置文件setting.xml");        
        JarUtil pathUtil = new JarUtil(this.getClass());
        String path = pathUtil.getJarPath();
        File url = new File(path + File.separator + "setting.xml");
        Element root = null;
        Document doc = null;
        SAXReader xmlReader = new SAXReader();
        try {
            doc = xmlReader.read(url);
        } catch (Exception ex) {
            logger.info("setting.xml" + "不是合法的配置文件", ex);
            throw ex;
        }

        logger.info(">>>配置系統信息...讀取配置文件setting.xml完畢....開始分析配置文件信息");
        root = doc.getRootElement();
                ......
}

 

來波連接

        Java解析xml的四種經典方法    詳解Java解析XML的四種方法—DOM/SAX/jdom/dom4j   XML解析——Java中XML的四種解析方式

        使用JDOM操做XML    Dom4j完整教程

相關文章
相關標籤/搜索