在 Java 中使用 SAX api 解析流输入中没有根元素的 XML 片段列表是否可行?
我尝试解析这样的 XML,但得到了
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
甚至在 endDocument 事件被触发之前。
我不想采用明显但笨拙的解决方案,例如“预先附加自定义根元素或使用缓冲片段解析”。
我正在使用Java 1.6的标准SAX API。 SAX 工厂有 setValidating(false) 以防有人想知道。
首先,也是最重要的一点,您正在解析的内容不是 XML 文档。 来自XML 规范:
[定义:有恰好有一个元素,称为根,或文档元素,其任何部分都不会出现在任何其他元素的内容中。]
现在,至于用 SAX 解析它 - 尽管你所说的笨拙 - 我建议采用以下方法:
Enumeration<InputStream> streams = Collections.enumeration(
Arrays.asList(new InputStream[] {
new ByteArrayInputStream("<root>".getBytes()),
yourXmlLikeStream,
new ByteArrayInputStream("</root>".getBytes()),
}));
SequenceInputStream seqStream = new SequenceInputStream(streams);
// Now pass the `seqStream` into the SAX parser.
SequenceInputStream
是将多个输入流连接成单个流的便捷方法。它们将按照传递给构造函数的顺序读取(或者在本例中 - 由 Enumeration
返回)。
将其传递给您的 SAX 解析器,然后就完成了。
听起来您正在使用 XMPP。 如果是这样,有用于解析 XML 片段流的库。 W3C 发布了一份 XML 片段交换规范草案。 该草案旨在为如何标准化 XML 片段以进行交换提供指导。 该规范没有得到广泛采用,也没有得到积极维护。