解析复杂的 xml

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。

 

中规中矩的xml解析,都么有个啥,关键是复杂点的xml解析,而且是复杂点的一类xml,结构一样,但是内容完全不同

Demo.xml:


   
      
         


            Show
            OMSFHYCZCJSJ
            
               DDD系统
               BRUCE
            

            
               count
               50
            

         

         
            OK
         

         
            
               
                  ZHOGNG
                  广州
                  2018年第23周 (06.04~06.10)
                  16500
                  8800
                  2200000
                  0
                  0
                  16500
                  2200000
               

            

         

      
   

 

提供公共解析,如何公共解析,

即编写公共的获取xml值的方法。具体看码:

    /**
     * 结果集.
     */
    public static Map> xmlDataMaps=new LinkedHashMap>();
    /**
     * 节点个数.
     */
    private static Map nodeMap=new HashMap();
    
    /**
     * 通过字符串获得结果.
     * @param strVal:xml 字符串
     * @param nodeName:节点名称
     */
    public static void getXmlValByStr(String strVal,String nodeName) {
        if (strVal==null || strVal.length()==0) {
            return;
        }
        SAXReader sax = new SAXReader();
        Document document = null;
        try {
            InputStream stream=new ByteArrayInputStream(strVal.getBytes(Constant.ENCODING));
            document = sax.read(stream);
            document.setXMLEncoding(Constant.ENCODING);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        Element root = document.getRootElement();
        //获得节点个数.
        getXmlNodes(root,nodeName);
        int nodes=nodeMap.size();
        //初始化map集合
        initMaps(nodes);
        //获得数据.
        getXmlNodesVal(root,nodeName);
    }
    
    /**
     * 通过流获得结果.
     * @param stream:流对象
     * @param nodeName:节点名称
     */
    public static void getXmlValByStream(InputStream stream,String nodeName) {
        if (stream==null) {
            return;
        }
        SAXReader sax = new SAXReader();
        Document document = null;
        try {
            document = sax.read(stream);
            document.setXMLEncoding(Constant.ENCODING);
        }
        catch (DocumentException e) {
            e.printStackTrace();
        }
        Element root = document.getRootElement();
        //获得节点个数.
        getXmlNodes(root,nodeName);
        int nodes=nodeMap.size();
        //初始化map集合
        initMaps(nodes);
        //获得数据.
        getXmlNodesVal(root,nodeName);
    }
    
    /**
     * 通过文件获得对象.
     * @param filePath:文件绝对路径
     * @param nodeName:节点名称
     */
    public static void getXmlValByFile(String filePath,String nodeName) {
        if (filePath==null || filePath.length()==0) {
            return;
        }
        SAXReader sax = new SAXReader();
        File file=new File(filePath);
        Document document = null;
        try {
            document = sax.read(file);
            document.setXMLEncoding(Constant.ENCODING);
        }
        catch (DocumentException e) {
            e.printStackTrace();
        }
        Element root = document.getRootElement();
        //获得节点个数.
        getXmlNodes(root,nodeName);
        int nodes=nodeMap.size();
        //初始化map集合
        initMaps(nodes);
        //获得数据.
        getXmlNodesVal(root,nodeName);
    }

    /**
     * 初始化map集合.
     * @param nodes:节点数据.
     */
    private static void initMaps(int nodes) {
        for (int i = 0; i < nodes; i++) {
            Map tempValMap=new LinkedHashMap<>();
            xmlDataMaps.put(Constant.MAPTAG+i,tempValMap);
        }
    } 
    
    /**
     * 递归遍历所有子节点value
     * @param node
     * @param nodeName
     */
    @SuppressWarnings("unchecked")
    private static void getXmlNodesVal(Element node,String nodeName) {
        String tagName=node.getName();
        String tagVal=node.getTextTrim();
        String attrName ="";
        String attrValue ="";
        List listAttrs = node.attributes();
        for (Attribute attribute : listAttrs) {
            attrName=attribute.getName();
            attrValue=attribute.getValue();
        }
        if (tagName.equalsIgnoreCase(nodeName) && attrName.equalsIgnoreCase("ID")) {
            Map actualVals=new LinkedHashMap();
            String prex=nodeName+Constant.TAG;
            String key=attrValue.substring(prex.length(), attrValue.length());
            List listElement = node.elements();
            for (Element element : listElement) {
                 tagName=element.getName();
                 tagVal=element.getTextTrim();
                 actualVals.put(tagName, tagVal);
            }
            xmlDataMaps.put(Constant.MAPTAG+key,actualVals);
        }
        List listElement = node.elements();
        for (Element element : listElement) {
            getXmlNodesVal(element,nodeName);
        }
    }

    /**
     * 获得节点的个数.
     * @param root
     * @param nodeName
     * @return
     */
    @SuppressWarnings("unchecked")
    private static void getXmlNodes(Element root,String nodeName) {
        String tagName=root.getName();
        String attrName ="";
        String attrValue ="";
        List listAttrs = root.attributes();
        for (Attribute attribute : listAttrs) {
            attrName=attribute.getName();
            attrValue=attribute.getValue();
        }
        if (tagName.equalsIgnoreCase(nodeName) && attrName.equalsIgnoreCase("ID") && attrValue.contains(nodeName)) {
            String prex=nodeName+Constant.TAG;
            String key=attrValue.substring(prex.length(), attrValue.length());
            nodeMap.put(key,attrValue);
        }
        List listElement = root.elements();
        for (Element element : listElement) {
            getXmlNodes(element,nodeName);
        }
    }
    
    /**
     * 清除内存中的数据.
     */
    public static void clearData() {
        nodeMap.clear();
        xmlDataMaps.clear();
    }

 

如此就可以将某类复杂的xml解析完成了,并获将获得的值以key,value 的方式保存起来。

 

 

 

你可能感兴趣的:(代码管理)