从流输入中解析没有根元素的 XML 片段列表

问题描述 投票:0回答:2

在 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) 以防有人想知道。

java xml xml-parsing sax
2个回答
13
投票

首先,也是最重要的一点,您正在解析的内容不是 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 解析器,然后就完成了。


0
投票

听起来您正在使用 XMPP。 如果是这样,有用于解析 XML 片段流的库。 W3C 发布了一份 XML 片段交换规范草案。 该草案旨在为如何标准化 XML 片段以进行交换提供指导。 该规范没有得到广泛采用,也没有得到积极维护。

© www.soinside.com 2019 - 2024. All rights reserved.