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