在Java中逐行解析XML

在Java中逐行解析XML,java,xml,parsing,Java,Xml,Parsing,我想用Java逐行解析XML文件,因为我得到的文件框架与通常的有点不同。它不是嵌套的;每个标记都在自己的行中 XML文件的一部分: <sentence><flag>3</flag></sentence> <word><text>Zdravo</text></word> <phoneme><onephoneme>z</onephoneme></phoneme&g

我想用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>
...
3
兹德拉沃
Z
D
R
“a:
v
O
0
莫杰
...
我搜索并找到了很多不同的方法来解析XML文件,但所有这些方法都扫描了整个文件,我不想这样做,因为我的文件几乎有10万行,现在(甚至可能更晚)我只需要前800行,所以逐行解析要快得多。我不知道我确实需要提前多少行,但我想计算我到达标记并在特定计数时停止的次数(现在是17次,大约是第800行)

我找到的教程:

  • 嵌套XML:
  • 嵌套XML:
  • 带属性的单行XML:
然后每个句子被分成单词,每个单词被分成音素,所以最后我有3个数组列表:标志、单词和音素

我希望我给了你足够的信息


谢谢。

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

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


但是,如果您需要将其解析为XML,则流式XML读取器应该能够执行您想要的操作。根据,SAXStAX是标准选择。

您可以使用SAX解析器。在XML中,将逐行遍历,并触发相应的事件。此外,您可以使用遇到第800行停止解析时,键入数字并抛出异常。

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

行与XML不太相关,您可以使用所有XML一行中100K行的第th行。您需要做的是按您分析的元素/节点计数。使用SAX解析器,它基于事件,它将在元素开始和结束时通知您。每当您获得您感兴趣的元素时,递增计数器,这假设您知道您感兴趣的元素,从您的示例中,这些将是:

<sentence>
<word>
<phoneme>


等等。

我强烈建议使用SAX解析器,因为它可以使您在行结构发生变化时保持灵活性。例如,您可以通过在回调方法中抛出自定义异常来中断SAX解析。@qqilihq谢谢,我会尝试一下。谢谢您的回答,但我事先不知道我需要800行。我的限制器是nu标签的数量。所以我想在我点击17个句子时退出循环。我仍然可以按照你的建议做吗?谢谢!我用SAXParser做的。这比我从一开始就想的要容易得多-我不知道
start
length
代表什么。当我到达第18个句子b时,我仍然不知道如何完成但我读到让解析器解析整个XML更容易,因为这比执行异常要快。@bajagaraja很酷,不客气。不幸的是,除了在一定数量的元素之后抛出异常来取消解析器之外,没有其他方法了。不过我建议使用自定义异常,例如
ParseLimitReachedException
停止解析,则文档可能会增长到无法让其一直运行到最后的程度。使用自定义异常将允许您将其与其他与XML解析本身相关的异常区分开来。我了解到,如果文件没有那么大,则“异常的处理可能不仅仅是解析整个XML文件,所以现在我将把它留在这里,因为它需要几秒钟才能完成。但我看到了一些带有自定义例外的示例,如果必要,我会记住这一点。再次感谢。@bajagaraja很酷,如果你能解决你的问题,那么你可能想要接受任何答案。