XMLStreamReader问题

时间:2010-11-15 13:00:41

标签: java xml filestream

我正在使用XMLStreamReader中的javax.xml接口来解析XML文件。该文件包含大量数据量和几KB的单个文本节点。

验证和阅读通常非常有效,但是我遇到了大于15k字符的文本节点的问题。此功能发生此问题

String foo = "";
if (xsr.getEventType() == XMLStreamConstants.CHARACTERS) {
    foo = xsr.getText();
    xsr.next(); // read next tag
}
return foo;

xsr是流阅读器。在这种特殊情况下,文本节点中的文本长度为53'337个字符(但会有所不同),但xsr.getText()方法只返回它们的前15'537个字符。当然我可以遍历函数并连接字符串,但不知怎的,我认为这不是想法......

我在文档或其他任何地方都没有找到任何相关信息。它是预期的行为还是某人可以确认/否认它?我是以某种方式错误地使用它吗?

由于

2 个答案:

答案 0 :(得分:1)

  

当然我可以遍历函数并连接字符串,但不知怎的,我认为这不是想法......

实际上, 的想法是:)

只要它与原始文档一致,就允许解析器根据需要分解事件流。这意味着它可以并且经常会将您的文本数据分解为多个事件。如何以及何时选择这样做是解析器内部的实现细节,并且基本上是不可预测的。

所以是的,如果您收到多个连续CHARACTERS个事件,则需要手动附加它们。这是您为低级API支付的价格。

答案 1 :(得分:0)

另一个选项是javax.xml.stream.isCoalescing选项(记录在XMLStreamReader.next()Using StAX),它会自动将长文本连接成一个字符串。以下JUint3测试通过。

警告:isCoalescing可能不应该在生产中使用,因为如果文档有很多字符引用( )或实体引用(<),它将会导致StackOverflowError!

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import junit.framework.TestCase;

public class XmlStreamTest extends TestCase {
    public void testLengthInXMlStreamReader() throws XMLStreamException {
        StringBuilder b = new StringBuilder();
        b.append("<root>");
        for (int i = 0; i < 65536; i++)
            b.append("hello\n");
        b.append("</root>");
        InputStream is = new ByteArrayInputStream(b.toString().getBytes());
        XMLInputFactory inputFactory = XMLInputFactory.newFactory();
        inputFactory.setProperty("javax.xml.stream.isCoalescing", true);
        XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
        reader.nextTag();
        reader.next();
        assertEquals(6 * 65536, reader.getTextLength());
    }
}