package com.ceair.apm.common.faxUtil;import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class Dom4jXml { private Map<String, Object> map = new HashMap<String, Object>(); public static void main(String[] args) {
Dom4jXml dom4j = new Dom4jXml();
String xmlStr = "<SubSendFaxListTable><SubSendFaxListIDRow><SubSendFaxListID>10178</SubSendFaxListID></SubSendFaxListIDRow></SubSendFaxListTable>";
dom4j.treeWalk(xmlStr);
dom4j.show();
} /**
* 解析指定的XML字符串
*
* @param xmlStr 要解析的XML
* @return 解析后的XML
* 每一个子元素为一个MAP
* 当还有下一级时 map.put(key,ArrayList<HashMap<string,Object>>)
* 为文本节点时 map.put(key,value)
*/
public Map<String, Object> parseXml(String _xmlstr) {
treeWalk(_xmlstr);
return map;
} /**
* 显示解析后的xml文件
*/
public void show() {
for (Object map_show : map.keySet()) {//除去根节点后的所有所有节点
if (map.get((String) map_show) instanceof ArrayList) {
ArrayList<HashMap<String, String>> obj = (ArrayList<HashMap<String, String>>) map.get((String) map_show);
System.out.println(map_show);
for (HashMap<String, String> map_item : obj) {//读取文本节点
for (String map_obj : map_item.keySet()) {
System.out.println(map_obj + "____________________" + map_item.get(map_obj));
}
}
}
}
} /**
* 解析指定的XML字符串
*
* @param xmlStr 要解析的XML
*/
public void treeWalk(String xmlStr) { StringReader read = new StringReader(xmlStr);
SAXReader reader = new SAXReader();
Document doc;
try {
doc = reader.read(read);
Element root = doc.getRootElement();
treeWalk(root);
// log.info("成功解析XML");
} catch (DocumentException e) {
e.printStackTrace();
// log.info("解析XML发生异常");
} } /**
* 遍历XML字符串 并且封装到MAP中
*
* @param element XML中的元素
*/
public void treeWalk(Element element) { for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
if (!((Element) node).isTextOnly()) {
if (null==map.get(node.getName())) map.put(node.getName(), null);
}
treeWalk((Element) node); } else { // do something....
Object obj = map.get(node.getParent().getParent().getName());
if (null==obj) obj = new ArrayList<HashMap<String, String>>();
HashMap<String, Object> node_map = new HashMap<String, Object>();
// node_map.put(node.getParent().getName(), node.getText());
node_map.put(node.getParent().getName(), element.getText());//new tcc 1008
((ArrayList) obj).add(node_map);
map.put(node.getParent().getParent().getName(), obj);
} } }
}
为什么在递归遍历xml得到SubSendFaxListID节点的文本值会把10178分开,实在不解,请大伙指点指点!
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class Dom4jXml { private Map<String, Object> map = new HashMap<String, Object>(); public static void main(String[] args) {
Dom4jXml dom4j = new Dom4jXml();
String xmlStr = "<SubSendFaxListTable><SubSendFaxListIDRow><SubSendFaxListID>10178</SubSendFaxListID></SubSendFaxListIDRow></SubSendFaxListTable>";
dom4j.treeWalk(xmlStr);
dom4j.show();
} /**
* 解析指定的XML字符串
*
* @param xmlStr 要解析的XML
* @return 解析后的XML
* 每一个子元素为一个MAP
* 当还有下一级时 map.put(key,ArrayList<HashMap<string,Object>>)
* 为文本节点时 map.put(key,value)
*/
public Map<String, Object> parseXml(String _xmlstr) {
treeWalk(_xmlstr);
return map;
} /**
* 显示解析后的xml文件
*/
public void show() {
for (Object map_show : map.keySet()) {//除去根节点后的所有所有节点
if (map.get((String) map_show) instanceof ArrayList) {
ArrayList<HashMap<String, String>> obj = (ArrayList<HashMap<String, String>>) map.get((String) map_show);
System.out.println(map_show);
for (HashMap<String, String> map_item : obj) {//读取文本节点
for (String map_obj : map_item.keySet()) {
System.out.println(map_obj + "____________________" + map_item.get(map_obj));
}
}
}
}
} /**
* 解析指定的XML字符串
*
* @param xmlStr 要解析的XML
*/
public void treeWalk(String xmlStr) { StringReader read = new StringReader(xmlStr);
SAXReader reader = new SAXReader();
Document doc;
try {
doc = reader.read(read);
Element root = doc.getRootElement();
treeWalk(root);
// log.info("成功解析XML");
} catch (DocumentException e) {
e.printStackTrace();
// log.info("解析XML发生异常");
} } /**
* 遍历XML字符串 并且封装到MAP中
*
* @param element XML中的元素
*/
public void treeWalk(Element element) { for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
if (!((Element) node).isTextOnly()) {
if (null==map.get(node.getName())) map.put(node.getName(), null);
}
treeWalk((Element) node); } else { // do something....
Object obj = map.get(node.getParent().getParent().getName());
if (null==obj) obj = new ArrayList<HashMap<String, String>>();
HashMap<String, Object> node_map = new HashMap<String, Object>();
// node_map.put(node.getParent().getName(), node.getText());
node_map.put(node.getParent().getName(), element.getText());//new tcc 1008
((ArrayList) obj).add(node_map);
map.put(node.getParent().getParent().getName(), obj);
} } }
}
为什么在递归遍历xml得到SubSendFaxListID节点的文本值会把10178分开,实在不解,请大伙指点指点!
难道说与xml节点相似有关?还有网上说element.nodeCount()=1表示有子元素,那element.nodeCount()=2怎么讲,不解!