gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:37:51 27 4
gpt4 key购买 nike

我需要解析一个连续的格式良好的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com