【问题标题】:XMLStreamReader ProblemXMLStreamReader 问题
【发布时间】:2010-11-15 13:00:40
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java xml filestream


    【解决方案1】:

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

    其实,的想法:)

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

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

    【讨论】:

    • 我认为他们应该在文档中的某处提及它。所以你最终会到处写循环,因为你永远不知道解析器什么时候会分解一个事件……很烦人。谢谢你这么快的回答:)
    【解决方案2】:

    另一个选项是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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多