gpt4 book ai didi

java - 解析巨大的 xml 文件以从子标签中获取不同的值 - 需要最佳方法建议

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:22 24 4
gpt4 key购买 nike

我有给定形式的 xml。

 <myData>
<myElement>
<myGroupID>ID1</myGroupID>
<myGroupValue>value1</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID2</myGroupID>
<myGroupValue>value2</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID3</myGroupID>
<myGroupValue>value3</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID4</myGroupID>
<myGroupValue>value4</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID1</myGroupID>
<myGroupValue>value1</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID2</myGroupID>
<myGroupValue>value2</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID3</myGroupID>
<myGroupValue>value3</myGroupValue>
</myElement>
<myElement>
<myGroupID>ID4</myGroupID>
<myGroupValue>value4</myGroupValue>
</myElement>
<myData>

文件中myElement标签的总数可以是2-400万个,每个元素中还有其他标签。可以看出,myGroupIDmyGroupValue 标记对于不同的元素具有重复的值。

我的要求是获取 myGroupIDmyGroupValue 标记的不同值。

我试图将 Stax 解析器与 Iterator api [基于事件的方法] 结合使用。我了解到的是,我必须遍历所有标签来检查 event.getLocalName 是否为 myGroupIDmyGroupValue 以及是否所以,然后我必须使用我的逻辑来检查文件已解析的部分是否具有与当前元素相同的值。

但是使用这种方法,我不必要地迭代其他标签[除了 myGroupIDmyGroupValue ],这看起来是浪费时间。

知道如何直接跳转到元素中具有特定名称的标签吗?

更不用说我对stax解析的了解是0甚至更少,今天才有机会学习它,而且我将使用java来进行这个解析。

预先感谢我们的善意建议。

更新:

感谢大家的宝贵意见。目前,我正在使用 Stax Iterator API 来满足需求,并且它似乎工作得非常快。此外,代码使用的内存也是可以接受的 ~3mb,而我正在解析的文件的总大小为 55mb。因此,这对我来说一切都很好。

有几件事仍然困扰着我:- XML 包含前导训练 空格以及'-' 字符。当我们不解析文件而是直接解析来自 HTTPConnection 输入流的 XML 时,有什么建议可以摆脱它们吗?

我没有选择在这里获得更好的 XML [没有 前导尾随空格 以及 '-' 字符] ,因为我收到的 XML 实际上是来自另一个系统的服务的响应,并且他们还没有准备好修改其代码来满足我们系统的要求。

最佳答案

为什么不使用SAX? http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

public void startElement(....) {
if (qName.equalsIgnoreCase("myElement")) {
//do stuff, inElement = true, prepare new element...
}

else if (qName.equalsIgnoreCase("MYGROUPID") && inElement) {
//do stuff
}

else if (qName.equalsIgnoreCase("MYGROUPVALUE") && inElement) {
//do stuff
}

类似地,在 endElement() 中,当找到“myElement”右大括号时,您应该将 inElement 切换为 false 并使用从当前元素获取的 groupId 和 groupValue 存储或执行任何其他操作。这是最好的方法,而且速度相当快 - 甚至比 Stax 还要快,而且内存需求仍然很小。

关于java - 解析巨大的 xml 文件以从子标签中获取不同的值 - 需要最佳方法建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20668150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com