基于jdom的xml cdata内容解析

大家好,我是帅气小伙,今天为大家分享的是一次技术支持过程中的经验。
有以下一段xml数据



    
        
        
        
        
        
        
        

]]>
]]> ]]> 39岁 02 消化内科病房 2011-03-01 小曹 0000001010 371283001212 1010120 消化内科病房 192.168.3.2 jzh-pc pda系统

其中CDATA 这些比较特殊,是为了防止标签值中有特殊字符而导致破坏xml规范的特殊语法。
在这里我推荐大家用 jdom,因为我试了很多种xml解析的类库,基本上都不行。只用jdom满足。

maven

      
        
            org.jdom
            jdom
            1.1.3
        

xml 转 map,基本上转了map之后,后面的格式都可以解决了。

    /**
     * 含cdata的xml转map
     * @param xml
     * @return
     */
    public static Map xml2Map(String xml){
        Map tree = new LinkedHashMap<>();
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document = builder.build(new StringReader(xml));
            Element root = document.getRootElement();// 获得根节点
            //xml 都会有根节点,如果根节点有多个子节点,那么它必定是一个数组,否则它是一个对象,因此先初始化一个map
            tree.put(root.getName(), new LinkedHashMap<>());
            //递归遍历节点下的各元素
            parseNode(root,tree);
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tree;
    }

    private static void  parseNode (Element root ,Map map){
        final String rootName = root.getName();//根节点名称
        //遍历根节点下的子节点
        for(Object object : root.getChildren()){
            if(object instanceof Element){
                Element element = (Element)object;
                Object rootObj = map.get(rootName);
                //先判断这个父节点是否为数组,再判断子节点是否也是数组,如果是那么递归遍历
                if(rootObj instanceof ArrayList){
                    if(element.getChildren().size()>0){
                        LinkedHashMap linkedHashMap = new LinkedHashMap();
                        linkedHashMap.put(element.getName(),new LinkedHashMap<>());
                        ((List)rootObj).add(linkedHashMap);
                        parseNode(element,(LinkedHashMap)linkedHashMap);
                    }
                }else{
                    //如果父节点不是数组,子节点是也是一个对象,如果它有多个节点,必定是属性节点
                    if(element.getChildren().size()>0){
                        ((LinkedHashMap)rootObj).put(element.getName(),new ArrayList<>());

                    }else{
                        ((LinkedHashMap)rootObj).put(element.getName(),element.getValue());
                    }
                    parseNode(element,(LinkedHashMap)rootObj);
                }
            }
        }
    }

这个递归很饶,不知道有没有更好的实现,目前是实现了我的需求的。但是对于xml的 attribute 解析是实现不了的。

你可能感兴趣的:(基于jdom的xml cdata内容解析)