1.xml字符串解析: 在做微信支付時,都是在用xml做傳輸媒介,雖然微信SDK集成了xml轉map的功能,但是順帶學習一下用dom4j將xml轉map的方法,分享出來,代碼如下:
/**
* 將xml字符串轉換爲map集合
*ClassName:TransferUtils
*<p>company:wwww.kinglong.com</P>
*<p>Desc:</p>
* @author kinglong_hao
* @date 2017年5月1日上午9:13:32
*/
public class TransferUtils {
public static Map<String, Object> transferMapFromXml(String xml) throws DocumentException{
//創建容器
Map<String, Object> map = new ConcurrentHashMap<String,Object>();
Document document = DocumentHelper.parseText(xml);
Element rootEle = document.getRootElement();
//獲取根節點元素集合
List elements = rootEle.elements();
for(Iterator<Element> j = elements.iterator(); j.hasNext(); )
{
//獲取子元素
Element element = j.next();
//輸出子元素
map.put(element.getName(), element.getText());
}
return map;
}
}
另外,它的取值也多種多樣:
// 枚舉所有子節點
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚舉名稱爲 foo 的節點
for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚舉屬性
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
微信返回的xml字符串:
" <xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx8a3fcf509313fd74]]></appid>
<mch_id><![CDATA[1361137902]]></mch_id>
<nonce_str><![CDATA[5SQR7XiEr2hI6WQ4]]></nonce_str>
<sign><![CDATA[7E6B37367DD59FC4963A9EF7F2A2ADB1]]></sign>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[INVALID_REQUEST]]></err_code>
<err_code_des><![CDATA[201 商戶訂單號重複]]></err_code_des>
</xml> "
2.xml字符串解析: 上一個只是一個特殊的簡單案例,正常情況下遇到的大多會在上一個基礎上有下一級節點,所以,這時只需要再次對其進行遍歷即可,如果要封裝的話,個人想到的是將其封裝爲對象,對象的下一級子節點爲對象的屬性即可.
public static void getMapFromXml(String xml) throws DocumentException {
Document document = DocumentHelper.parseText(xml);
//獲取根節點
Element root = document.getRootElement();
// 遍歷根節點下的子節點
for (Iterator i = root.elementIterator(); i.hasNext();) {
Element element = (Element) i.next();
//dosome
System.out.println(element.getName() );
//繼續遍歷該子節點下的子節點
for (Iterator j = element.elementIterator(); j.hasNext();) {
Element ele = (Element) j.next();
//dosome
System.out.println(" " + ele.getName() + "=====>" + ele.getText());
}
}
}
3.讀取xml文件並解析,與字符串解析不同的就是document對象的獲取方式不同,其餘取值方法相同
// 從文件讀取 XML,輸入文件名,返回 XML 文檔
public Document read(String fileName) throws
MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}
4.創建xml文檔public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(root);
Element author1 = root
.addElement(author)
.addAttribute(name, James)
.addAttribute(location, UK)
.addText(James Strachan);
Element author2 =root
.addElement(author)
.addAttribute(name, Bob)
.addAttribute(location, US)
.addText(Bob McWhirter);
return document;
}
5.xml文檔輸出
public void write(Document document) throws IOException {
// 指定文件
XMLWriter writer = new XMLWriter(
new FileWriter( output.xml )
);
writer.write( document );
writer.close();
// 美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format );
writer.write( document );
// 縮減格式
format = OutputFormat.createCompactFormat();
writer = new XMLWriter( System.out, format );
writer.write( document );
}