【发布时间】:2011-10-02 05:11:03
【问题描述】:
我需要解析一个连续的格式良好的 XML 元素流,我只得到一个已经构造好的 java.io.Reader 对象。这些元素没有包含在根元素中,也没有以像 <?xml version="1.0"?>" 这样的 XML 标头作为前缀,而是在其他方面是有效的 XML。
使用 Java org.xml.sax.XMLReader 类不起作用,因为 XML 阅读器希望从封闭的根元素开始解析格式良好的 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 输出保存到文件来测试上述内容,并且它可以工作。但是,这种方法不适用于我的情况,并且无法插入此类额外信息(XML 标头、根元素),因为传递给我的代码的 java.io.Reader 对象已经构建。
本质上,我正在寻找“分段 XML 解析”。所以,我的问题是,是否可以使用标准 Java API(包括 org.sax.xml.* 和 java.xml.* 包)来完成?
【问题讨论】: