7

更新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 流,并且不想将整个源文本加载到内存中。

谢谢你的帮助,尤里。

4

6 回答 6

3

你可以得到你想要的——部分解析​​,但是当你到达当前可用数据的末尾时,你不能关闭流。保持流打开,当它到达流的末尾时解析器将简单地阻塞。当您有更多数据时,将其添加到流中,解析器将继续。

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

于 2010-05-31T01:15:28.667 回答
1

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

建议:您可能需要阅读更多关于套接字和流如何工作的内容,然后再继续深入。

希望这可以帮助。

于 2010-04-16T15:09:06.843 回答
1

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

于 2010-10-02T00:37:38.047 回答
0

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

  • START_ELEMENT(根)
  • CHARACTERS(和之间的空格)
  • START_ELEMENT(儿童)

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

于 2010-04-16T15:17:39.323 回答
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
于 2019-03-13T18:46:31.657 回答
-2

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

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

于 2010-04-16T15:16:32.183 回答