/**
*@描述 带属性xml转map
*@参数 xmlStr xml字符串 needRootKey 属性是否转map
*@返回值 map
*@创建人 Lixiaolin
*@创建时间 2021/11/29
*@修改人和其它信息
*/
public static Map xml2mapWithAttr(String xmlStr, boolean needRootKey) throws DocumentException {
Document doc = DocumentHelper.parseText(xmlStr);
Element root = doc.getRootElement();
Map<String, Object> map = (Map<String, Object>)xml2mapWithAttr(root);
if(root.elements().size()==0 && root.attributes().size()==0){
return map; //根节点只有一个文本内容
}
if(needRootKey){
//在返回的map里加根节点键(如果需要)
Map<String, Object> rootMap = new HashMap<String, Object>();
rootMap.put(root.getName(), map);
return rootMap;
}
return map;
}
/**
*@描述 带属性xml转map,操作
*@参数 element
*@返回值 map
*@创建人 Lixiaolin
*@创建时间 2021/11/29
*@修改人和其它信息
*/
private static Map xml2mapWithAttr(Element element) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
List<Element> list = element.elements();
List<Attribute> listAttr0 = element.attributes(); // 当前节点的所有属性的list
for (Attribute attr : listAttr0) {
map.put("@" + attr.getName(), attr.getValue());
}
if (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Element iter = list.get(i);
List mapList = new ArrayList();
if (iter.elements().size() > 0) {
Map m = xml2mapWithAttr(iter);
if (map.get(iter.getName()) != null) {
Object obj = map.get(iter.getName());
if (!(obj instanceof List)) {
mapList = new ArrayList();
mapList.add(obj);
mapList.add(m);
}
if (obj instanceof List) {
mapList = (List) obj;
mapList.add(m);
}
map.put(iter.getName(), mapList);
} else
map.put(iter.getName(), m);
} else {
List<Attribute> listAttr = iter.attributes(); // 当前节点的所有属性的list
Map<String, Object> attrMap = null;
boolean hasAttributes = false;
if (listAttr.size() > 0) {
hasAttributes = true;
attrMap = new LinkedHashMap<String, Object>();
for (Attribute attr : listAttr) {
attrMap.put("@" + attr.getName(), attr.getValue());
}
}
if (map.get(iter.getName()) != null) {
Object obj = map.get(iter.getName());
if (!(obj instanceof List)) {
mapList = new ArrayList();
mapList.add(obj);
// mapList.add(iter.getText());
if (hasAttributes) {
attrMap.put("#text", iter.getText());
mapList.add(attrMap);
} else {
mapList.add(iter.getText());
}
}
if (obj instanceof List) {
mapList = (List) obj;
// mapList.add(iter.getText());
if (hasAttributes) {
attrMap.put("#text", iter.getText());
mapList.add(attrMap);
} else {
mapList.add(iter.getText());
}
}
map.put(iter.getName(), mapList);
} else {
// map.put(iter.getName(), iter.getText());
if (hasAttributes) {
attrMap.put("#text", iter.getText());
map.put(iter.getName(), attrMap);
} else {
map.put(iter.getName(), iter.getText());
}
}
}
}
} else {
// 根节点的
if (listAttr0.size() > 0) {
map.put("#text", element.getText());
} else {
map.put(element.getName(), element.getText());
}
}
return map;
}
public static void main(String[] args) {
String xml="<?xml version=\"1.0\"?>" +
"<ufinterface roottag=\"voucheraddreturn\" docid=\"\" proc=\"add\" sender=\"u8\" receiver=\"930\" request-roottag=\"voucher\">" +
" <item accounting_period=\"11\" voucher_type=\"测试\" voucher_id=\"\" entry_id=\"\" succeed=\"0\" dsc=\"已成功保存\" u8accounting_period=\"11\" u8voucher_id=\"41\"></item>" +
"</ufinterface>";
try {
Map<String, Object> stringObjectMap = xml2mapWithAttr(xml,true);
Map<String, Object> ufinterfaceMap=(Map<String, Object>)stringObjectMap.get("ufinterface");
Map<String, Object> itemMap=(Map<String, Object>)ufinterfaceMap.get("item");
String succeed = itemMap.get("@succeed").toString();
String dsc = itemMap.get("@dsc").toString();
/*for (String in : itemMap.keySet()) {
//map.keySet()返回的是所有key的值
String str = itemMap.get(in).toString();//得到每个key多对用value的值
System.out.println(in + " " + str);
}*/
System.out.println(succeed+" "+dsc);
} catch (Exception e) {
e.printStackTrace();
}
}
注意:属性转Map该方法将属性K加了@,执行顺序,先转第一个节点ufinterface,再转item,再次获取item的属性
参考文章:https://blog.csdn.net/qq_26101151/article/details/53309765