我在這裏提出的沒有任何測試,但這些是我認爲我會採取的路線。
如果響應長度預計會很小,我個人可能只是去把級聯XML響應轉換爲String
你的建議,然後要麼使用標準String
方法提取單獨的XML文檔,或再次按照您的建議,刪除XML聲明字符串並用一對根元素包裝整個批次。這將取決於您是否想用單個文檔或多個文檔來提供您的XML解析器。我在年齡方面沒有處理BasicHttpResponse
,但我認爲您可以使用mBasicHttpResponse.getEntity().getContent()
獲得響應實體的InputStream
,然後使用多種方法之一從InputStream
獲得String
。
如果在另一方面,我期望能夠處理相當冗長的數據,或者如果響應實體可以包含串聯的XML文檔的一個不確定的數字,然後,我會代替想想有一個自定義包裹所獲得的InputStream
InputStream
或Reader
說執行(a)剝離聲明和(b)插入新的根元素。 SO上還有其他人問了一個非常類似的問題,你面臨的問題是here,除了他沒有處理的聲明。綜觀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()
);
但是另外在這種情況下,您可以用CustomFilterFileInputStream
代替FileInputStream
,您自己創建該CustomFilterFileInputStream
以執行剝離聲明行。您的CustomFilterFileInputStream
會環繞從您的BasicHttpResponse
獲得的InputStream
,然後使用SequenceInputStream
添加新的根標記。
這就是我認爲你需要去的方向,如果你真的有以這種方式接受XML數據,並且你希望在單個響應中處理大量的數據。
如果您確定'<?xml'字符串沒有出現在xml的cdata部分,那麼split就是要走的路。您可以使用'「<?xml」'作爲分隔符字符串。 – Praveen
在一個字符串中有兩個XML已經足夠了。我會去拆分。 –
知道爲什麼XML數據必須以這種形式出現,以及是否可以避免這一點很有趣。但是,如果只需要這樣,那麼知道該數據到達哪種格式和典型大小會很有用。另外,您需要使用哪個解析器。 SAX?我問,因爲如果它可能相當大,並且源自File例如,那麼解決這個問題可能更好,這個問題是圍繞'InputStream'封裝的定製緩衝讀取器。但是,如果大小很小,那麼就按照你的建議使用'String's,也許用'ByteArrayInputStream'包裝String並使用SAX。 – Trevor