`

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完美转换XML、JSON

    此外,由于xStream默认的安全设置,直接反序列化不受信任的XML或JSON可能存在安全风险,因此在生产环境中,务必启用安全模式并使用适当的过滤器来保护应用程序。 总结来说,xStream是一个强大且灵活的工具,能够...

    xStream-1.31 jar包

    因此,生产环境中使用xStream时,应确保开启安全模式,并对输入数据进行适当的验证和过滤。 总的来说,xStream 1.31 jar包是Java开发者处理XML和JSON数据的强大工具,它的易用性、灵活性和性能使得在各种项目中都能...

    XStream jar包

    对于敏感数据,XStream提供了安全模式,可以自动过滤掉不应出现在XML输出中的字段,从而提高安全性。 在实际应用中,XStream常用于Web服务、数据库持久化、配置文件存储等领域。例如,它可以轻松地将Java对象写入...

    xstream源码

    SanitizingConverter会过滤掉不安全的XML标签和属性。 - **PermissionPolicy**: 用户可以自定义策略来控制哪些类和字段可以被序列化或反序列化,增加安全性。 4. **自定义序列化** - **Annotation处理**: XStream...

    xstream1.4.15.JAR

    XStream 是一个流行的 Java 库,用于将对象序列化为 XML 和从 XML 反序列化回对象。这个库广泛应用于各种 Java 应用程序,尤其是那些需要在网络间传输或存储对象数据的情况。在标题提到的 "xstream1.4.15.JAR" 文件...

    腾讯蓝军安全通告:XStream修复14个安全漏洞.pdf

    腾讯蓝军发布的安全通告明确指出了XStream库在处理XML文件序列化过程中存在的14个安全漏洞,并强调了其中5个严重漏洞,这些漏洞允许攻击者通过构造特定的XML数据绕过黑名单拦截,并利用JDK库触发反序列化操作执行...

    SpringMVC 使用JSON、XML视图

    接下来,我们需要在`web.xml`中配置SpringMVC的核心控制器`DispatcherServlet`,以及设置字符编码过滤器`CharacterEncodingFilter`,确保数据在传输过程中保持正确的编码格式。 然后,在`dispatcher.xml`...

    bookman:简单的JavaFX图书管理器

    #Bookman 只是一个小玩具应用程序,可以对JavaFX进行一些试验。 以xml文件作为持久性的图书收藏管理。 跑步 mv books_sample.xml books.xml mvn package java -jar target/bookman.jar ...添加排序和过滤

    mina程序执行过程

    通常,你可以自定义这些实现,或者使用Mina提供的现成实现,如 `XstreamCodecFactory`,它使用 XStream 库处理XML编码和解码。 - **ExecutorFilter**:Mina 提供的线程池 Filter,它使用 `Executors....

    rxjava 相关 jar

    3. **xstream-1.4.8.jar**: XStream 是一个 Java 库,用于将 Java 对象序列化为 XML,反之亦然。这在处理数据持久化、网络传输或配置文件时非常有用。在 RxJava 的上下文中,XStream 可能用于将数据对象转换成 XML ...

    Log4cxx使用例子

    `xstream-1.1.2.jar`是一个XML序列化库,可能用于将日志信息转换为XML格式以便在网络中传输或存储。`log4j-xml-1.3alpha-7.jar`则表明Log4cxx支持XML配置文件,这提供了更灵活的配置选项,可以更精细地控制日志输出...

    JBoss ESB 学习笔记

    - **实现**:使用XML解析技术,如XStream等工具将XML数据转换为Java对象。 #### 十六、第十五个ESB应用Web Service Consumer 1 - **重点**:作为Web服务消费者,调用远程Web服务。 - **实现**:配置Web服务客户端...

    华为安全编码规范考试.md

    - **知识点**:使用 XStream 和 JDK 原生 API 进行反序列化时,应采取相应的安全措施。 - **解释**:例如,使用白名单检查、重载 `resolveClass()` 方法等,而 `XMLDecoder` 不推荐使用,因为它缺乏足够的安全特性。...

    spring 常用jar包

    11. **spring-oxm.jar**:对象/XML映射模块,提供了将对象模型和XML数据相互转换的功能,支持JAXB、Castor、XStream等。 12. **spring-aspects.jar**:提供了对AspectJ的集成,使得可以在Spring应用中使用更强大的...

    Spring的jar包

    10. **spring-orm.jar** 和 **spring-oxm.jar**:ORM模块支持与流行的对象关系映射库(如Hibernate、JPA)集成,而OXM模块则处理对象-XML映射,支持如JAXB、Castor、XMLBeans和XStream等库。 这些jar包组合起来,...

    spring常用包

    9. **spring-orm**和**spring-oxm**:spring-orm支持与流行的ORM框架(如Hibernate、JPA)集成,而spring-oxm则提供了与对象/XML映射库的集成,如JAXB、Castor、XStream等。 10. **spring-instrument**:这个模块...

    Bootstrap嵌入jqGrid,使你的table牛逼起来

    jqGrid提供了丰富的功能,包括排序、分页、过滤、编辑和数据检索等,使得表格具有高度的操作性。 本篇教程旨在介绍如何在Bootstrap环境中嵌入jqGrid,以创建功能完善的表格组件。首先,我们来看一下预期的效果。...

Global site tag (gtag.js) - Google Analytics