逐行解析Java中的XML

时间:2014-07-23 09:14:10

标签: java xml parsing

我想逐行解析Java 中的XML文件,因为我得到的文件框架与平常有点不同。它不是嵌套的;每个标签都在自己的行中。

XML文件的一部分:

<sentence><flag>3</flag></sentence>
<word><text>Zdravo</text></word>
<phoneme><onephoneme>z</onephoneme></phoneme>
<phoneme><onephoneme>d</onephoneme></phoneme>
<phoneme><onephoneme>r</onephoneme></phoneme>
<phoneme><onephoneme>"a:</onephoneme></phoneme>
<phoneme><onephoneme>v</onephoneme></phoneme>
<phoneme><onephoneme>O</onephoneme></phoneme>
<sentence><flag>0</flag></sentence>
<word><text>moje</text></word>
...

我搜索并发现了许多不同的方法来解析XML文件,但是所有这些方法都扫描整个文件而我不希望这样,因为我的文件几乎是100k行,现在(甚至可能更晚)我只需要前800行,所以只需逐行解析就会快得多。我不知道我提前需要多少行,但是我想知道有多少次我达到标签并停在一定数量(现在是17 - 这就是800行左右)。

我发现的教程:

然后将每个句子分成单词,将每个单词分成音素,最后我有3个ArrayLists:标志,单词和音素。

我希望我能给你足够的信息。

谢谢。

5 个答案:

答案 0 :(得分:1)

Andrew Stubbs建议使用SAX和StAX,但如果你的文件非常大,我会使用VTD-XML,它至少比SAX快3倍,而且更加灵活。处理2GB XML根本不是问题

答案 1 :(得分:1)

行与XML并不真正相关,您可以在一行中拥有价值100K的所有XML。您需要做的是按您解析的元素/节点计数。使用SAX解析器,它是基于事件的,它会在元素开始时和结束时通知您。每当你得到一个元素,你有兴趣解析增量计数器,这假设你知道你感兴趣的元素,从你的例子,那些将是:

<sentence>
<word>
<phoneme>

答案 2 :(得分:0)

如果要逐行读取文件,则与XML无关。只需使用BufferedReader,因为它提供了readLine方法。 使用简单的计数器,您可以检查已经阅读了多少行,并在达到800标记后退出循环。

答案 3 :(得分:0)

正如@Korashen所说,如果你可以保证你将要处理的文件将遵循扁平的逐行结构,那么你可能最好假装文件根本不是XML,并使用正常BufferedReader

但是,如果您需要将其解析为XML,那么流式 XML阅读器应该能够执行您想要的操作。根据{{​​3}}, SAX StAX 是标准选择。

答案 4 :(得分:0)

您可以使用sax解析器。在xml中逐行遍历并触发适当的事件。此外,您可以使用org.xml.sax.Locator来识别行号,并在遇到第800行停止解析时抛出异常。