我需要解析连续的格式良好的XML元素,我只向其提供已构建的java.io.Reader
对象。这些元素不包含在根元素中,也不用像<?xml version="1.0"?>"
这样的XML头部,而是其他有效的XML。解析没有根元素的XML流
使用Java org.xml.sax.XMLReader
类不起作用,因为XML Reader希望解析格式良好的XML,从一个封闭的根元素开始。因此,它只是读取流中的第一个元素,它将其视为根,并且会在下一个元素中失败,其典型格式为
org.xml.sax.SAXParseException:文档后面的标记根元素必须是良构的。
对于不包含根元素的文件,但如果这样的元素不存在或无法被定义(和被调用,比如说,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
输出的一部分保存到文件来测试上述内容,并且它可以正常工作。但是,这种方法不适用于我的情况,因为传递给我的代码的对象java.io.Reader
已经构建,所以不能插入这些额外信息(XML标头,根元素)。
本质上,我正在寻找“零碎的XML解析”。所以,我的问题是,可以使用标准的Java API(包括org.sax.xml.*
和java.xml.*
包)来完成吗?
可以参考[解决“的根元素下面的文档中的标记必须很好形成的”异常(http://opensourceforgeeks.blogspot.in/2015/01/resolving-markup-in- document-following.html) –