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