Dom4J的常用方法

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 );
 } 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章