我在这里提出的任何建议都没有经过测试,但这些是我认为我会采取的路线。
如果预计响应长度很小,我个人可能只是String
按照您的建议将连接的 XML 响应放入 a 中,然后使用标准String
方法提取单个 XML 文档,或者再次按照您的建议删除 XML声明字符串并用一对根元素包装整个批次。这取决于您是想为 XML 解析器提供单个文档还是多个文档。我已经很久没有处理过BasicHttpResponse
,但我认为您可以使用 获取InputStream
响应实体mBasicHttpResponse.getEntity().getContent()
,然后使用多种可能的方法之一从中String
获取InputStream
。
另一方面,如果我希望处理相当长的数据,或者如果响应实体可能包含不确定数量的连接 XML 文档,那么我会考虑InputStream
使用自定义包装获得的数据,InputStream
或者Reader
执行 (a) 剥离声明和 (b) 插入新的根元素。SO上还有其他人问了一个与您在这里面临的问题非常相似的问题,只是他没有要处理的声明。查看 user656449 的答案,我们看到了一个建议,即InputStream
在将其传递给 SAX 解析器之前如何使用一些虚拟根元素包装它:
(公然从引用的SO问题/答案中复制):
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()
);
但另外在这种情况下,您可以将 替换为您自己创建的FileInputStream
某种类型,CustomFilterFileInputStream
以执行声明行的剥离。您CustomFilterFileInputStream
将环绕InputStream
从您获得的BasicHttpResponse
内容,然后使用SequenceInputStream
添加新的根标签。
如果您真的必须以这种方式接受 XML 数据,并且您希望在单个响应中处理大量数据,那么我认为您需要采用这种方向。