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