<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    從制造到創造
    軟件工程師成長之路
    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 閱讀(961) 評論(0)  編輯  收藏 所屬分類: 學習筆記

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

    常用鏈接

    留言簿(9)

    我參與的團隊

    隨筆分類(245)

    隨筆檔案(239)

    文章分類(3)

    文章檔案(3)

    收藏夾(576)

    友情鏈接

    搜索

    •  

    積分與排名

    • 積分 - 457951
    • 排名 - 114

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本免费高清一本视频| 精品无码免费专区毛片| 免费亚洲视频在线观看| 亚洲AV无码国产精品色| 四虎永久在线精品免费观看视频| 亚洲综合一区二区| 国产免费毛不卡片| 亚洲GV天堂无码男同在线观看| 在线jyzzjyzz免费视频| 亚洲精品av无码喷奶水糖心| 国产无遮挡吃胸膜奶免费看 | 最近中文字幕完整免费视频ww| 久久久亚洲欧洲日产国码农村| 一级特黄aa毛片免费观看| 亚洲国语在线视频手机在线| 午夜电影免费观看| 免费很黄无遮挡的视频毛片| 亚洲性久久久影院| 日本在线看片免费| 久久精品亚洲AV久久久无码 | 亚洲人成网站影音先锋播放| 88av免费观看入口在线| 亚洲香蕉在线观看| 国产99视频免费精品是看6| 国产成人精品免费大全| 久久久久亚洲精品日久生情| 性色av免费观看| 国产精品免费看久久久香蕉| 亚洲日韩图片专区第1页| 成人免费a级毛片| 人妻18毛片a级毛片免费看| 色噜噜综合亚洲av中文无码| 在线天堂免费观看.WWW| 免费无遮挡无码视频在线观看 | 猫咪免费人成网站在线观看| 亚洲熟女精品中文字幕| 亚洲色大成网站www永久一区 | 免费夜色污私人影院网站电影| 亚洲av之男人的天堂网站| 免费可以在线看A∨网站| 精品一区二区三区免费观看 |