9

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

4

1 回答 1

13

首先,也是最重要的一点,您要解析的内容不是 XML 文档。从XML 规范

[定义:只有一个元素,称为 root或文档元素,它的任何部分都不会出现在任何其他元素的内容中。]

现在,关于用 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 解析器,您就完成了。

于 2012-06-27T13:18:37.857 回答