XStream过滤xml

在实际中,类的属性很多,嵌套层次也很复杂,如果仅仅使用XStream原生API来硬编码设置别名等属性,显得太生硬也难以维护。完全可以考虑通过一个xml配置文件来定义所有用到的类的别名定义(包括其成员),然后,通过读取配置构建一个XStream的工厂,在用到时候直接去取,而不是让实用者组装。我目前的一个项目中,就是这么实现的,效果非常的好。

下面我给出针对上面提出的问题一个解决方案:
思想:考虑做一个过滤器,在xml转java之前,在Java转xml之后,应用这个过滤器。这个过滤器提供将xml中的“__”替换为“-”,并且将xml中的不需要的节点剔除。
在过滤之前,我实现了个转换器装配,这一步通过xml来配置,并在java中获取。
代码就省略了,这一步很灵活,关键看你的应用了。

为了能过滤xml,我们需要用Dom4j递归遍历xml文档。下面一些算法代码:

    //递归算法:遍历配置文件,找出所有有效的xpath
    private static void recursiveElement(Element element) {
        List<Element> elements = element.elements();
        validXPathList.add(element.getPath());
        if (elements.size() == 0) {
            //没有子元素
        } else {
            //有子元素
            for (Iterator<Element> it = elements.iterator(); it.hasNext();) {
                //递归遍历
                recursiveElement(it.next());
            }
        }
    }

    //递归算法:遍历xml,标识无效的元素节点
    private static void recursiveFixElement(Element element) {
        List<Element> elements = element.elements();
        if (!validXPathList.contains(element.getPath())) {
            element.addAttribute("delete", "true");
        }
        if (elements.size() == 0) {
            //没有子元素
        } else {
            //有子元素
            for (Iterator<Element> it = elements.iterator(); it.hasNext();) {
                Element e = it.next();
                if (!validXPathList.contains(e.getPath())) {
                    e.addAttribute("delete", "true");
                }
                //递归遍历
                recursiveFixElement(e);
            }
        }
    }

    /**
     * 过滤器接口方法,转换不规范字符,剔除无效节点
     *
     * @param xmlStr 要过滤的xml
     * @return 符合转换器要求的xml
     */
    public static String filter(String xmlStr) {
        Document document = null;
        try {
            document = DocumentHelper.parseText(xmlStr.replaceAll("__", "_"));
            //递归的调用:标记要剔除的xml元素
            recursiveFixElement(document.getRootElement());     
            List<Node> nodeList = document.selectNodes("//@delete");
            for (Node node : nodeList) {
                node.getParent().detach();  //剔除xml元素
            }
        } catch (DocumentException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return document.asXML();
    }

你可能感兴趣的:(xstream)