【发布时间】:2019-11-27 19:46:10
【问题描述】:
我是 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结构与实际相比过于简单,类型要复杂得多。
【问题讨论】:
-
一旦您指定了过滤哪些节点以及允许通过哪些节点的标准,这就是 XSLT 中的简单身份转换适应。如果您需要更具体的信息,则必须缩小广泛问题的范围。
标签: java dom xpath xml-parsing