私がここで提案するものは何もテストされていませんが、これらは私が取ると思うルートです。
応答の長さが短いと予想される場合は、個人的には、連結されたXML応答String
を提案どおりに配置し、標準的なString
方法を使用して個々のXMLドキュメントを抽出するか、提案したようにXMLを削除します。宣言文字列を作成し、ルート要素のペアでロット全体をラップします。XMLパーサーに単一のドキュメントをフィードするか、複数のドキュメントをフィードするかによって異なります。私は昔から扱っていませんが、を使用して応答エンティティのを取得し、そこからを取得するために可能な多くの方法の1つを使用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
addsを使用して新しいルートタグを追加します。CustomFilterFileInputStream
InputStream
BasicHttpResponse
SequenceInputStream
このようにXMLデータを実際に受け入れる必要があり、1回の応答で大量のXMLデータを処理することを期待している場合は、このような方向に進む必要があると思います。