java - 解析没有根元素的 XML 流

标签 java xml sax xmlreader

我需要解析一个连续的格式良好的 XML 元素流,我只得到一个已经构造好的 java.io.Reader目的。这些元素没有包含在根元素中,也没有像 <?xml version="1.0"?>" 这样的 XML header 作为前缀。 , 但在其他方面都是有效的 XML。

使用 Java org.xml.sax.XMLReader类不起作用,因为 XML 阅读器希望从封闭的根元素开始解析格式良好的 XML。因此,它只读取流中的第一个元素,它认为这是根元素,并在下一个元素中失败,典型的

org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.

对于不包含根元素但此类元素确实存在或可以定义(称为 MyRootElement)的文件,可以执行如下操作:

        Strint path = <the full path to the file>;

        XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();

        StringBuilder buffer = new StringBuilder();

        buffer.append("<?xml version=\"1.0\"?>\n");
        buffer.append("<!DOCTYPE MyRootElement ");
        buffer.append("[<!ENTITY data SYSTEM \"file:///");
        buffer.append(path);
        buffer.append("\">]>\n");
        buffer.append("<MyRootElement xmlns:...>\n");
        buffer.append("&data;\n");
        buffer.append("</MyRootElement>\n");

        InputSource source = new InputSource(new StringReader(buffer.toString()));

        xmlReader.parse(source);

我已经通过保存 java.io.Reader 的一部分测试了上面的内容输出到一个文件,它工作。但是,这种方法不适用于我的情况,并且无法插入此类额外信息(XML header 、根元素),因为 java.io.Reader传递给我的代码的对象已经构建。

本质上,我正在寻找“碎片化的 XML 解析”。所以,我的问题是,是否可以使用标准 Java API(包括 org.sax.xml.*java.xml.* 包)来完成?

最佳答案

SequenceInputStream 来拯救:

    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    SAXParser parser = saxFactory.newSAXParser();

    parser.parse(
        new SequenceInputStream(
            Collections.enumeration(Arrays.asList(
            new InputStream[] {
                new ByteArrayInputStream("<dummy>".getBytes()),
                new FileInputStream(file),//bogus xml
                new ByteArrayInputStream("</dummy>".getBytes()),
            }))
        ), 
        new DefaultHandler()
    );

关于java - 解析没有根元素的 XML 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640756/

相关文章:

java - 将变量从 jBoolean 类型转换为 bool

java - Spring Boot 应用程序中的 View 未渲染

Java 使用 SAX 处理 XML

java - 如何创建使用 SAX 解析 xml 的处理程序?

javaFX 将 ObservableList 与表绑定(bind)

java - 带有 Netty4 的 Spring RestTemplate 和 AsyncRestTemplate 永远挂起

android - 为对话框中的按钮设置背景?

xml - Common Lisp Closure XML 包中广播处理程序的无效输出

java - json 转 xml java

java - 如何解析 xml 元素节点 susing pig 脚本?