Java XMLStreamReader问题

Java XMLStreamReader问题,java,xml,filestream,Java,Xml,Filestream,我正在使用javax.xml中的XMLStreamReader接口来解析xml文件。该文件包含大量数据和数KB的单个文本节点 验证和读取通常工作得很好,但我遇到了大于15k字符的文本节点问题。此函数中出现问题 String foo = ""; if (xsr.getEventType() == XMLStreamConstants.CHARACTERS) { foo = xsr.getText(); xsr.next(); // read next tag } return fo

我正在使用
javax.xml
中的
XMLStreamReader
接口来解析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个字符。当然,我可以循环函数并连接字符串,但不知何故,我认为这不是我的想法

我在文档中或其他任何地方都没有找到与此相关的任何内容。这是故意的行为还是有人能证实/否认?我用错了吗

谢谢

当然,我可以循环函数并连接字符串,但不知何故,我认为这不是我的想法

事实上,这就是想法:)

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


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

另一个选项是
javax.xml.stream.isCoalescing
选项(记录在或中),它自动将长文本连接到单个字符串中。以下JUint3测试通过

警告:isCoalescing可能不应在生产中使用,因为如果文档有大量字符引用(
 ;
)或实体引用(
),它将导致堆栈溢出错误

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());
    }
}
import java.io.ByteArrayInputStream;
导入java.io.InputStream;
导入javax.xml.stream.XMLInputFactory;
导入javax.xml.stream.XMLStreamException;
导入javax.xml.stream.XMLStreamReader;
导入junit.framework.TestCase;
公共类XmlStreamTest扩展了TestCase{
public void testLengthInXMlStreamReader()引发XMLStreamException{
StringBuilder b=新的StringBuilder();
b、 附加(“”);
对于(int i=0;i<65536;i++)
b、 附加(“hello\n”);
b、 附加(“”);
InputStream is=new ByteArrayInputStream(b.toString().getBytes());
XMLInputFactory inputFactory=XMLInputFactory.newFactory();
setProperty(“javax.xml.stream.isCoalescing”,true);
XMLStreamReader=inputFactory.createXMLStreamReader(is);
reader.nextTag();
reader.next();
assertEquals(6*65536,reader.getTextLength());
}
}

我想他们应该在文档中的某个地方提到它。因此,您将在任何地方都编写循环,因为您永远不知道解析器何时将分解事件……这很烦人。谢谢你这么快的回答:)