從制造到創造
          軟件工程師成長之路
          posts - 292,  comments - 96,  trackbacks - 0
          需求:
          對XML中的特定內容進行排序:
          原始XML:
          <?xml version="1.0" encoding="UTF-8"?>
          <hostgateway>
              
          <header>
                  
              
          </header>
              
          <line no="1">
                  
          <msgHeader />
                  
          <msgBody>
                      
          <data id="FEE_AMT_4" value="0000000000" />
                      
          <data id="FEE_TOTAL_2" value="0000000000" />
                      
          <data id="FEE_AMT_3" value="0000000000" />
                      
          <data id="FEE_TOTAL_1" value="0000000000" />
                      
          <data id="FEE_AMT_2" value="0000000000" />
                      
          <data id="FEE_AMT_1" value="0000000000" />
                      
                  
          </msgBody>
              
          </line>
          </hostgateway>

          這里我們可以看到,msgBody節點的數據data部分沒有按照id進行排序,而很多id是相同的,只是后面有后綴_1、_2之類的,我們的目的是將所有的msgBody節點下的內容按照id的內容進行排序,注意這里的id和value是配對的,所以要用對象封裝起來。

          1、用Dom4j讀取xml:
                      // 使用 SAXReader 解析 XML 文檔 
                     SAXReader saxReader 
          = new SAXReader();
                      Document document 
          = saxReader.read(new File(
                              
          "c:/catalog/rtnP4_JCA3.xml"));

                      
          // inputXml 是從 c:/catalog/catalog.xml 創建的 java.io.File。
                      
          // 使用 XPath 表達式從 article 元素中獲得 level 節點列表。
                      
          // 如果 level 屬性值是“Intermediate”則改為“Introductory”。
                      List list = document.selectNodes("//msgBody/data/@id");
                      Iterator iter 
          = list.iterator();
                      
          while (iter.hasNext()) {
                          Attribute at 
          = (Attribute) iter.next();
                          String pathStr 
          = "hostgateway/line/msgBody/data[@id='"
                                  
          + at.getText() + "']/@value";
                          System.out.println(pathStr);
                          String a 
          = document.valueOf(pathStr);
                          System.out.println(
          "value: " + a);
                          data 
          = new Data();
                          data.setId(at.getText());
                          data.setValue(a);
                          listBody.add(data);
                      }
          注:
          1、直接用SAXReader讀取XML文件,傳入參數為File;
          2、可以通過document.selectNodes("")方式,傳入XPath路徑,得到ID的List;
          3、通過document.valueOf("xxx")可以直接得到某個屬性的值。

          2、寫XML
                      /** 建立document對象 */
                      Document document 
          = DocumentHelper.createDocument();
                      
          /** 建立XML文檔的根hostgateway */
                      Element rootElement 
          = document.addElement("hostgateway");
                      
          /** 加入第一個head節點 */
                      Element headElement 
          = rootElement.addElement("header");
                      
          /** 加入action節點 */
                      Element actionElement 
          = headElement.addElement("action");
                      
          /** 加入type參數內容 */
                      actionElement.addAttribute(
          "type""transaction");
                      actionElement.addAttribute("type""transaction");
          說明:
          A、先通過DocumentHelper創建一個Document對象;
          B、然后建立根節點;
          C、再在根節點上增加子節點;
          D、通過addAttribute增加屬性;如果有多個屬性可繼續使用addAttribute方法;

          生成XML文件
              /**
               * XML的編碼方式為本地ANSI
               * 
               * 
          @param document
               * 
          @param filename
               * 
          @throws IOException
               
          */
              
          private static void writerXMLANSI(Document document, String filename)
                      
          throws IOException {

                  OutputFormat format 
          = OutputFormat.createPrettyPrint();
                  XMLWriter writer 
          = new XMLWriter(new FileWriter(filename), format);
                  writer.write(document);
                  writer.close();
              }

              
          /**
               * XML的編碼方式為UTF-8
               * 
               * 
          @param document
               * 
          @param filename
               * 
          @throws IOException
               
          */
              
          private static void writerXMLUTF8(Document document, String filename)
                      
          throws IOException {
                  OutputFormat format 
          = OutputFormat.createPrettyPrint();
                  FileOutputStream fos 
          = new FileOutputStream(new File(filename));
                  XMLWriter writer 
          = new XMLWriter(fos, format);
                  writer.write(document);
                  writer.close();
              }

          通過 FileWriter 創建的XML生成的編碼格式在簡體中文環境會是GBK格式,如果想保存為編碼格式為UTF-8,則必須使用FileOutputStream。

          完整代碼:
          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.FileWriter;
          import java.io.IOException;
          import java.util.ArrayList;
          import java.util.Collections;
          import java.util.Iterator;
          import java.util.List;

          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;

          /**
           * 
          @author XL
           * 
           
          */
          public class SortedXML {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  create();
              }    

              
          public static void create() {
                  
          try {
                      
          /** 建立document對象 */
                      Document document 
          = DocumentHelper.createDocument();

                      
          /** 建立XML文檔的根hostgateway */
                      Element rootElement 
          = document.addElement("hostgateway");

                      
          /** 加入第一個head節點 */
                      Element headElement 
          = rootElement.addElement("header");

                      
          /** 加入action節點 */
                      Element actionElement 
          = headElement.addElement("action");

                      
          /** 加入type參數內容 */
                      actionElement.addAttribute(
          "type""transaction");

                      
          /** 加入data節點 */
                      List listHead 
          = initListHead();
                      insertData(headElement, listHead);

                      
          /** 加入第二個節點line */
                      Element lineElement 
          = rootElement.addElement("line");
                      lineElement.addAttribute(
          "no""1");

                      
          /** 加入msgHeader節點 */
                      lineElement.addElement(
          "msgHeader");

                      
          /** 加入msgBody節點 */
                      Element msgBodyElement 
          = lineElement.addElement("msgBody");

                      
          /** 加入data節點 */
                      List listBody 
          = initListBody();
                      insertData(msgBodyElement, listBody);

                      
          /** 加入type參數內容 */

                      
          /** 格式化輸出 */
                      writerXMLANSI(document, 
          "c:/catalog/rtnP4_JCA3_40.xml");
                      writerXMLUTF8(document, 
          "c:/catalog/rtnP4_JCA3_41.xml");
                  } 
          catch (IOException e) {
                      e.printStackTrace();
                  }
              }

              
          /**
               * XML的編碼方式為本地ANSI
               * 
               * 
          @param document
               * 
          @param filename
               * 
          @throws IOException
               
          */
              
          private static void writerXMLANSI(Document document, String filename)
                      
          throws IOException {

                  OutputFormat format 
          = OutputFormat.createPrettyPrint();
                  XMLWriter writer 
          = new XMLWriter(new FileWriter(filename), format);
                  writer.write(document);
                  writer.close();
              }

              
          /**
               * XML的編碼方式為UTF-8
               * 
               * 
          @param document
               * 
          @param filename
               * 
          @throws IOException
               
          */
              
          private static void writerXMLUTF8(Document document, String filename)
                      
          throws IOException {
                  OutputFormat format 
          = OutputFormat.createPrettyPrint();
                  FileOutputStream fos 
          = new FileOutputStream(new File(filename));
                  XMLWriter writer 
          = new XMLWriter(fos, format);
                  writer.write(document);
                  writer.close();
              }

              
          /**
               * 初始化XML表頭
               * 
               * 
          @return
               
          */
              
          private static List initListHead() {
                  List listHead 
          = new ArrayList();
                  listHead.add(
          new Data("sessionId""CSIrzFmHlZ8Lwcc_okMucJrH_iZ04975"));
                  listHead.add(
          new Data("applicationId""CSI"));
                  listHead.add(
          new Data("luType""LU62"));
                  listHead.add(
          new Data("transactionId""P4_JCA3"));

                  
          return listHead;
              }

              
          /**
               * 獲得原始XML中的msgBody中的
               * 
               * 
          @return
               
          */
              
          private static List initListBody() {

                  List listBody 
          = new ArrayList();

                  
          try {
                      Data data 
          = null;
                      
          // 使用 SAXReader 解析 XML 文檔 catalog.xml:
                      SAXReader saxReader = new SAXReader();
                      Document document 
          = saxReader.read(new File(
                              
          "c:/catalog/rtnP4_JCA3.xml"));

                      
          // inputXml 是從 c:/catalog/catalog.xml 創建的 java.io.File。
                      
          // 使用 XPath 表達式從 article 元素中獲得 level 節點列表。
                      
          // 如果 level 屬性值是“Intermediate”則改為“Introductory”。
                      List list = document.selectNodes("//msgBody/data/@id");
                      Iterator iter 
          = list.iterator();
                      
          while (iter.hasNext()) {
                          Attribute at 
          = (Attribute) iter.next();
                          String pathStr 
          = "hostgateway/line/msgBody/data[@id='"
                                  
          + at.getText() + "']/@value";
                          System.out.println(pathStr);
                          String a 
          = document.valueOf(pathStr);
                          System.out.println(
          "value: " + a);
                          data 
          = new Data();
                          data.setId(at.getText());
                          data.setValue(a);
                          listBody.add(data);
                      }

                      sortVO(listBody);

                  } 
          catch (DocumentException e) {
                      e.printStackTrace();
                      System.out.println(e.getMessage());
                      
          return null;
                  }

                  
          return listBody;
              }

              
          /**
               * 將List中的對象按照ID進行排序
               * 
               * 
          @param list
               
          */
              
          public static void sortVO(List list) {
                  Collections.sort(list);
              }

              
          /**
               * 將List中的Data對象增加到節點中
               * 
               * 
          @param headElement
               * 
          @param list
               
          */
              
          public static void insertData(Element headElement, List list) {
                  
          int size = list.size();
                  Element dataElement 
          = null;
                  Data data 
          = null;
                  
          for (int i = 0; i < size; i++) {
                      data 
          = (Data) list.get(i);
                      dataElement 
          = headElement.addElement("data");
                      dataElement.addAttribute(
          "id", data.getId());// 增加第一個屬性
                      dataElement.addAttribute("value", data.getValue());// 增加第二個屬性
                  }
              }

          }

          /**
           * Data對象,實現Comparable接口
           * 
           * 
          @author XL
           * 
           
          */
          class Data implements Comparable {
              
          private String id;
              
          private String value;
              
          public Data() {
              }

              
          public Data(String id, String value) {
                  
          super();
                  
          this.id = id;
                  
          this.value = value;
              }

              
          public String getId() {
                  
          return id;
              }
              
          public void setId(String id) {
                  
          this.id = id;
              }
              
          public String getValue() {
                  
          return value;
              }
              
          public void setValue(String value) {
                  
          this.value = value;
              }
              
          public int compareTo(Object o) {
                  Data d 
          = (Data) o;
                  
          return this.getId().compareTo(d.getId());
              }
          }

          輸出結果:
          <?xml version="1.0" encoding="UTF-8"?>

          <hostgateway>
            
          <header>
              
          <action type="transaction"/>
              
            
          </header>
            
          <line no="1">
              
          <msgHeader/>
              
          <msgBody>
                
          <data id="AP-DATE" value=""/>
                
          <data id="AP-STUS" value="A()"/>
                
          <data id="APR1" value="13.07"/>
                
          <data id="APR2" value="15.24"/>
                
          <data id="APR3" value="16.89"/>
                
          <data id="APR4" value="00.00"/>
                
          <data id="AP_AMT" value="5000"/>
                
              
          </msgBody>
            
          </line>
          </hostgateway>

          參考:
          1、dom4j 寫UTF-8的xml亂碼問題
          2、dom4j的utf-8解決方法
          posted on 2008-08-20 15:14 CoderDream 閱讀(962) 評論(0)  編輯  收藏 所屬分類: 學習筆記

          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(9)

          我參與的團隊

          隨筆分類(245)

          隨筆檔案(239)

          文章分類(3)

          文章檔案(3)

          收藏夾(576)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 458376
          • 排名 - 114

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 湖南省| 台山市| 庆安县| 包头市| 西充县| 衡阳县| 石首市| 萨迦县| 顺昌县| 衡南县| 文登市| 邢台县| 达拉特旗| 永昌县| 清原| 绥棱县| 凌海市| 镇江市| 丹东市| 合阳县| 大姚县| 江西省| 固镇县| 疏附县| 成都市| 永清县| 蕉岭县| 沙田区| 资中县| 玛多县| 霞浦县| 内黄县| 汽车| 屯留县| 金门县| 兴山县| 义乌市| 广安市| 西林县| 聊城市| 诸暨市|