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分开,实在不解,请大伙指点指点!

解决方案 »

  1.   

    自己调试了一下,发现在走到<SubSendFaxListID>这个节点时element.nodeCount()是等于2的, node会把<SubSendFaxListID>里的文本值截取4位,但当我把<SubSendFaxListID> 改成<Success>2222222</Success> 就不会被截取,xml改成如下:String xmlStr = "<SubSendFaxListTable><SubSendFaxListIDRow><Success>10178</Success></SubSendFaxListIDRow></SubSendFaxListTable>";
    难道说与xml节点相似有关?还有网上说element.nodeCount()=1表示有子元素,那element.nodeCount()=2怎么讲,不解!