dom4j解析xml
xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATAINFOS uuid="批数据uuid">
<DATAINFO>
<DESC1 REMARK="名称1">DESC1的值</DESC1>
<DESC2 REMARK="名称2">DESC1的值</DESC2>
<SPECIALITYCODES>
<SPECIALITYCODE SPECIALITYNAME="附属信息" CATEGORYCODE="" SPECIALITYCODE="ABCD">
<VALUELIST REMARK="列表属性">
<PROPERTYCODE PROPERTYCODE="A0001" STANDARDCODE="" PROPERTYNAME="节点编码">A0001的值</PROPERTYCODE>
<PROPERTYCODE PROPERTYCODE="A0002" STANDARDCODE="" PROPERTYNAME="节点编码">A0002的值</PROPERTYCODE>
</VALUELIST>
</SPECIALITYCODE>
<SPECIALITYCODE SPECIALITYNAME="附属信息" CATEGORYCODE="" SPECIALITYCODE="ABCD">
<VALUELIST REMARK="列表属性">
<PROPERTYCODE PROPERTYCODE="A0001" STANDARDCODE="" PROPERTYNAME="节点编码">A0001的值</PROPERTYCODE>
<PROPERTYCODE PROPERTYCODE="A0002" STANDARDCODE="" PROPERTYNAME="节点编码">A0002的值</PROPERTYCODE>
</VALUELIST>
</SPECIALITYCODE>
</SPECIALITYCODES>
</DATAINFO>
<DATAINFO>
<DESC1 REMARK="名称1">DESC1的值</DESC1>
<DESC2 REMARK="名称2">DESC1的值</DESC2>
<SPECIALITYCODES>
<SPECIALITYCODE SPECIALITYNAME="附属信息" CATEGORYCODE="" SPECIALITYCODE="ABCD">
<VALUELIST REMARK="列表属性">
<PROPERTYCODE PROPERTYCODE="A0001" STANDARDCODE="" PROPERTYNAME="节点编码">A0001的值</PROPERTYCODE>
<PROPERTYCODE PROPERTYCODE="A0002" STANDARDCODE="" PROPERTYNAME="节点编码">A0002的值</PROPERTYCODE>
</VALUELIST>
</SPECIALITYCODE>
<SPECIALITYCODE SPECIALITYNAME="附属信息" CATEGORYCODE="" SPECIALITYCODE="ABCD">
<VALUELIST REMARK="列表属性">
<PROPERTYCODE PROPERTYCODE="A0001" STANDARDCODE="" PROPERTYNAME="节点编码">A0001的值</PROPERTYCODE>
<PROPERTYCODE PROPERTYCODE="A0002" STANDARDCODE="" PROPERTYNAME="节点编码">A0002的值</PROPERTYCODE>
</VALUELIST>
</SPECIALITYCODE>
</SPECIALITYCODES>
</DATAINFO>
</DATAINFOS>
</DATA>
简单的xml可以进行转换成json然后取值很方便,但是像这种复杂的xml,转换出来的json是有问题的,所以这里用dom4j中的一些方法来解析
//先将xml转为Document
Document document = DocumentHelper.parseText(xmldata);
//获取根节点,这里取到的就是DATA节点
Element root = document.getRootElement();
//获取批数据uuid
String uuid = root.element("DATAINFOS").attributeValue("uuid");
//遍历DATAINFO,先拿到DATAINFO所在的List
List<Element> dataInfoList = root.element("DATAINFOS").elements("DATAINFO");
for(Element dataInfoEle: dataInfoList){
//获取DESC1节点的值-->"DESC1的值"
dataInfoEle.elementText("DESC1");
//每一条数据document对象
SAXReader saxReader = new SAXReader(); //加载XML文档
saxReader.setEncoding("UTF-8");
Document documentRead=null;
try{
String singlexmlstr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + dataInfoEle.asXML();
documentRead = saxReader.read(new ByteArrayInputStream(singlexmlstr.getBytes("UTF-8")));
}catch(Exception ex){
ex.printStackTrace();
}
//获取SPECIALITYCODES节点中的多个SPECIALITYCODE节点
List<Element> specialityCodeList = documentRead.selectNodes("/DATAINFO/SPECIALITYCODES/SPECIALITYCODE");
//遍历specialityCodeList
for (Iterator specialityCodeListIter = specialityCodeList.iterator(); specialityCodeListIter.hasNext();) {
Element specialityCode = (Element) specialityCodeListIter.next();
//获取SPECIALITYCODE中SPECIALITYCODE属性的值-->"ABCD"
String specilitycodename = specialityCode.attributeValue("SPECIALITYCODE");
//获取SPECIALITYCODE节点下的所有VALUELIST节点
List<Element> valueList = specialityCode.elements("VALUELIST");
//遍历valueList
for (Iterator valueListIter = valueList.iterator(); valueListIter.hasNext();){
Element valueEle = (Element) valueListIter.next();
//获取所有PROPERTYCODE节点
List<Element> propertyCodeList = valueEle.elements("PROPERTYCODE");
//遍历propertyCodeList
for(Element propertyCode: propertyCodeList){
//获取PROPERTYCODE节点中PROPERTYCODE属性的值-->"A0001"
propertyCode.attributeValue("PROPERTYCODE");
//获取PROPERTYCODE节点的值-->"A0001的值"
propertyCode.getText();
}
}
}
}
XML的格式不同,解析方式也不一样,根据实际的XML即可