dom4j 根據xml節點路徑查詢節點,找到對應的目標節點下的子節點,對節點Text值進行修改

Walter Sun發表於2018-04-27
<config>   
    <Property> 
    <Name>資料</Name>  
    <Level>0</Level>  
    <IsKey>0</IsKey>  
    <Key/>  
    <stdTableName>DB_MSSFJZ.T_MSSFJZDSRHZYSAR</stdTableName>  
    <stdFieldName>N_RDZXCJ</stdFieldName>  
    <stdType>INT</stdType>  
    <stdLength/>  
    <DefaultValue/>  
    <TranslateType/>  
    <TranslateCondition/>  
    <PreCondition/> 
  </Property>  
</config>

節選了xml的一段,需求:修改“人大_政協層級”的同級節點<stdType>將節點值由"INT"改為"Text".

root.element("stdType")方法:獲取root節點下名為<stdType>的節點;

root.elementText("Name")方法:獲取root節點下<Name>節點的文字;

package org.dom4j.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;

public class ChangeNodeData {

    private static String path = "F:\\15xsd修改\\testxml";

    public static void main(String[] args) {
        Element element = null;
        try {
            File folder = new File(path);
            //list()獲取目錄下所有檔案 
            //list()獲取目錄下所有檔案及目錄的絕對路徑
            //使用增強for遍歷目錄下檔案(批量處理xml檔案)
            for (File f : folder.listFiles()) {
                System.out.println("獲取檔案:" + f);

                //建立SAXReader,呼叫起read方法解析xml檔案
                SAXReader reader = new SAXReader();

                //讀取檔案,獲取document物件
                Document document = reader.read(f);

                //獲取根節點
                element = document.getRootElement();
                System.out.println("根節點:" + element);
                
                //根據xml節點路徑查詢節點
                List l=document.selectNodes("/config/Property");//設定查詢Property節點的xml路徑
                Iterator it=l.iterator();
                while(it.hasNext()){
                    Element elm=(Element)it.next(); 
                    if(elm.elementText("Name").equals("資料")){//獲取elm節點下的<Name>節點的內容與後面字串比較。
                        elm.element("stdType").setText("Text");//給<stdType>節點內容設為Text
                        System.out.println(elm.elementText("stdType")); 
                    }
                    
                }      
                try {
                    Writer osWrite = new OutputStreamWriter(
                            new FileOutputStream(f));//建立輸出流  
                    OutputFormat format = OutputFormat.createPrettyPrint(); //獲取輸出的指定格式    
                    format.setEncoding("UTF-8");//設定編碼 ,確保解析的xml為UTF-8格式  
                    XMLWriter writer = new XMLWriter(osWrite, format);//XMLWriter 指定輸出檔案以及格式    
                    writer.write(document);//把document寫入xmlFile指定的檔案(可以為被解析的檔案或者新建立的檔案)    
                    writer.flush();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
        }
    }
}

下面為結果(擷取部分):

<Property> 
    <Name>資料</Name>  
    <Level>0</Level>  
    <IsKey>0</IsKey>  
    <Key/>  
    <stdTableName>DB_MSSFJZ.T_MSSFJZDSRHZYSAR</stdTableName>  
    <stdFieldName>N_RDZXCJ</stdFieldName>  
    <stdType>Text</stdType>  
    <stdLength/>  
    <DefaultValue/>  
    <TranslateType/>  
    <TranslateCondition/>  
    <PreCondition/> 
  </Property>  

 

相關文章