我需要解析一个连续的、格式良好的XML元素流,我只能获得一个已经构建好的
使用Java的
java.io.Reader
对象。这些元素没有包含在根元素中,也没有像<?xml version="1.0"?>
这样的XML头,但它们是有效的XML。使用Java的
org.xml.sax.XMLReader
类不起作用,因为XML Reader期望解析以封闭根元素开始的格式良好的XML。所以它只读取流中的第一个元素,将其视为根,并在下一个元素中失败,产生典型的异常:
对于不包含根元素但存在或可以定义该元素(称为MyRootElement)的文件,可以执行以下操作:org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
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 头,根元素),因为传递给我的代码的 java.io.Reader
对象已经构造好了。
基本上,我正在寻找“分段 XML 解析”。所以,我的问题是,是否可以使用标准的 Java API(包括 org.sax.xml.*
和 java.xml.*
包)来完成它?