XMLStreamReader和一个真正的流

时间:2010-04-16 14:57:07

标签: java xml streaming stax

更新 Java社区中没有现成的XML解析器可以进行NIO和XML解析。这是我找到的最接近的,并且不完整:http://wiki.fasterxml.com/AaltoHome

我有以下代码:

InputStream input = ...;
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(input, "UTF-8");

问题是,为什么方法#createXMLStreamReader()希望在输入流中有一个完整的XML文档?为什么它被称为“流阅读器”,如果它似乎无法处理XML数据的一部分?例如,如果我提供:

<root>
    <child>

它会告诉我我错过了结束标签。甚至在我开始迭代流阅读器本身之前。我怀疑我只是不知道如何正确使用XMLStreamReader。我应该可以按件提供数据,对吗?我需要它,因为我正在处理来自网络套接字的XML流,并且不想将整个源文本加载到内存中。

谢谢你的帮助, 由里。

6 个答案:

答案 0 :(得分:2)

您可以获得所需内容 - 部分解析,但是当您到达当前可用数据的末尾时,不得关闭该流。保持流打开,解析器只有在到达流末尾时才会阻塞。当您有更多数据时,将其添加到流中,解析器将继续。

这种安排需要两个线程 - 一个线程运行解析器,另一个线程获取数据。要桥接这两个线程,可以使用一个管道 - 一个PipeInputStream和PipeOutputStream对,它将读取器线程中的数据推送到解析器使用的输入流中。 (解析器正在从PipeInputStream中读取数据。)

答案 1 :(得分:1)

流必须包含整个XML文档的内容,而不是同时包含在内存中的所有内容(这就是流所做的事情)。您可以保持流和阅读器打开以继续提供内容;但是,它必须是格式良好的XML文档的一部分。

建议:您可能希望在更远的地方阅读更多有关套接字和流如何工作的信息。

希望这有帮助。

答案 2 :(得分:1)

如果您绝对需要内容为“推送”的NIO,则有开发人员有兴趣为Aalto完成API。解析器本身是完整的Stax实现以及替代的“推送输入”(输入输入而不是使用InputStream)。因此,如果您有兴趣,可以考虑查看邮件列表。并非每个人都能阅读StackOverflow问题。 : - )

答案 3 :(得分:0)

您使用的是哪个Java版本?使用JDK 1.6.0_19,我得到了您似乎期待的行为。迭代你的示例XML片段给了我三个事件:

  • START_ELEMENT(root)
  • 字符(和之间的空格)
  • START_ELEMENT(孩子)

next()的第四次调用抛出一个XMLStreamException:[row,col]处的ParseError:[2,12] 消息:XML文档结构必须在同一实体内开始和结束。

答案 4 :(得分:0)

使用使用stax解析器的XMLEventReader,它对我来说没有任何问题。

  final XMLEventReader xmlEventReader= XMLInputFactory
                    .newInstance().createXMLEventReader(new FileInputStream(file));

文件显然是您的输入。

 while(xmlEventReader.hasNext()){

        XMLEvent xmlEvent = xmlEventReader.nextEvent();
        logger.debug("LOG XML EVENT "+xmlEvent.toString());
        if (xmlEvent.isStartElement()){ 
         //continue implementation

答案 5 :(得分:-2)

请查看此链接以了解有关流解析器如何工作的更多信息以及它如何使内存占用空间更小。对于传入的XML,您需要首先序列化传入的XML并创建格式良好的XML,然后将其提供给流解析器。

http://www.devx.com/xml/Article/34037/1954