java - 执行 XML 转换的最有效方法 - Java

标签 java dom xpath xml-parsing

我是 Java 新手,我想为社区提供意见。 我有一个巨大的 XML,其中包含大量信息。实际上,该 XML 包含大约 140Mb 的信息。 在这个XML中,我有很多不再有效的信息,所以我需要进行过滤并仅使用有效的信息,为了检查这一点,我需要在节点之间交叉信息,以检查是否需要删除。在某些情况下,需要删除整个父(主)节点。

我已经使用 dom 解析、使用循环来完成此操作,在我保存在变量中的循环内并交叉信息进行检查,并删除实际节点或整个父节点。

基本上,结构是这样的:

<source>
    <main>
        <id>98567</id>
        <block_information>
            <name>Block A</name>
            <start_date>20120210</start_date>
            <end_date>20150210</end_date>
        </block_information>
        <block_information>
            <name>Block A.01</name>
            <start_date>20150210</start_date>
            <end_date>20251005</end_date>
        </block_information>
        <city_information>
            <name>Manchester</name>
            <start_date>20150210</start_date>
            <end_date>20150212</end_date>
        </city_information>
        <city_information>
            <name>New Manchester</name>
            <start_date>20150212</start_date>
            <end_date>20251005</end_date>
        </city_information>
        <phone>
            <type>C</type>
            <number>987466321</number>
            <name></name>
        </phone>
        <phone>
            <type>P</type>
            <number>36547821</number>
            <name></name>
        </phone>
    </main>
    <main>
        <id>19587</id>
        <block_information>
            <name>Che</name>
            <start_date>20090210</start_date>
            <end_date>20100210</end_date>
        </block_information>
        <block_information>
            <name></name>
            <start_date>20100210</start_date>
            <end_date>20351005</end_date>
        </block_information>
        <city_information>
            <name></name>
            <start_date>20150210</start_date>
            <end_date>20150212</end_date>
        </city_information>
        <city_information>
            <name>No Name</name>
            <start_date>20150212</start_date>
            <end_date>20191005</end_date>
        </city_information>
        <phone>
            <type>C</type>
            <number>987466321</number>
            <name>Mom</name>
        </phone>
        <phone>
            <type>P</type>
            <number>36547821</number>
            <name></name>
        </phone>
    </main>
</source>

输出如下:

<result>
        <main>
                <id>98567</id>
                <block_name>Block A.01</block_name>
                <city_name>New Manchester</city_name>
                <cellphone></cellphone>
                <phone>36547821</phone>
                <contact_phone></contact_phone>
                <contact_phone_name></contact_phone_name>
        </main>
</result>

对于结果中输出的信息,必须有一个 <block_information><city_information>有效( <start_date> 小于实际日期且 <end_date> 大于实际日期),并且 <name...>两者都需要。 如果没有或多个有效,则 <main>将被删除。

对于电话号码,<type> [“C”代表联系人,“P”代表个人电话,“M”代表手机]。所以如果<type>是“C”,但 <name> 中没有值电话打不通结果。 “P”转到<phone>和“M”转到<cellphone> .

我希望您考虑什么是以最具绩效的方式做到这一点的最佳方法,并且如果需要的话,任何人都可以以简单的方式进行调整。

提前感谢您的投入!

按照 @kjhughes 的要求,我在示例 XML 上放置了一些值,以及我需要执行的一些过滤器。谢谢!

ps.:作为示例的 XML 结构与实际相比过于简单,还有很多更复杂的类型。

最佳答案

我会采用以下方法:

  • 找到一个库,可以让您流式传输 xml(文件或输入流)并生成 Stream<Main>
  • 处理Stream<Main>并过滤每个 Main根据您的验证逻辑节点
  • 根据您是否存在 I/O 或 CPU 瓶颈,请使用 .parallel() Stream 来处理流(阅读:测试 .parallel() 是否能以任何方式帮助您)

这足以满足 XML 解析上下文中任何合理的性能要求(我猜?)。谷歌 Java XML Stream然后从那里开始(或者也许this stackoverflow问题可以给出一些指示)

关于java - 执行 XML 转换的最有效方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101875/

相关文章:

javascript - 是否可以在没有 removeEventListener 的情况下删除事件监听器?

xml - xpath中是否有一个起始于/contains函数来搜索节点名称

java - 具有物理特性的快速而肮脏的平台游戏在移动平台时会出现错误

java - 在 Java 中执行文件 .lnk

java - 如何在DTO模型中实现JsonNode类型的字段

jquery - 所选元素在 html dom 中的路径是什么?

php - 从外部页面抓取 DIV 内的特定元素

c# - 用于选择节点的 XPath 查询

php - XPath查询结果顺序

java - 如何用jboss创建临时jms队列?