需求:
對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) 編輯 收藏 所屬分類:
學習筆記