2012-09-18 31 views
1

我有一個單一的InputStream或字符串帶有兩個個XML,像這樣:如何在一個文件中分解兩個連續的xml? (Java/Android設備)

<?xml version="1.0" standalone="yes"?> 
<items 
    blahblahblah1 
</items>   
<?xml version="1.0" standalone="yes"?> 
<items 
    blahblahblah2 
</items> 

它們具有相同的格式,但不同的數據。我想分析它們,但由於這不是有效的XML首先我需要找到一種方法來分裂它們。

浮現在腦海中的唯一的事情是字符串操作:

  1. 其拆分成兩個獨立的字符串,由子<?xml version="1.0 standalone="yes"?>
  2. 搜索並刪除兩個<?xml version="1.0 standalone="yes"?>線和環繞其餘與<ROOT> </ROOT>做出一個有效的xml,並找出如何從那裏解析它

但是,這兩種方法看起來都很詭異且效率低下。有沒有更好的辦法?

+1

如果您確定'<?xml'字符串沒有出現在xml的cdata部分,那麼split就是要走的路。您可以使用'「<?xml」'作爲分隔符字符串。 – Praveen

+2

在一個字符串中有兩個XML已經足夠了。我會去拆分。 –

+1

知道爲什麼XML數據必須以這種形式出現,以及是否可以避免這一點很有趣。但是,如果只需要這樣,那麼知道該數據到達哪種格式和典型大小會很有用。另外,您需要使用哪個解析器。 SAX?我問,因爲如果它可能相當大,並且源自File例如,那麼解決這個問題可能更好,這個問題是圍繞'InputStream'封裝的定製緩衝讀取器。但是,如果大小很小,那麼就按照你的建議使用'String's,也許用'ByteArrayInputStream'包裝String並使用SAX。 – Trevor

回答

1

我在這裏提出的沒有任何測試,但這些是我認爲我會採取的路線。

如果響應長度預計會很小,我個人可能只是去把級聯XML響應轉換爲String你的建議,然後要麼使用標準String方法提取單獨的XML文檔,再次按照您的建議,刪除XML聲明字符串並用一對根元素包裝整個批次。這將取決於您是否想用單個文檔或多個文檔來提供您的XML解析器。我在年齡方面沒有處理BasicHttpResponse,但我認爲您可以使用mBasicHttpResponse.getEntity().getContent()獲得響應實體的InputStream,然後使用多種方法之一從InputStream獲得String

如果在另一方面,我期望能夠處理相當冗長的數據,或者如果響應實體可以包含串聯的XML文檔的一個不確定的數字,然後,我會代替想想有一個自定義包裹所獲得的InputStreamInputStreamReader說執行(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數據,並且你希望在單個響應中處理大量的數據。

1

這是一個糟糕的設計,因爲字符串"<?xml"可能合法地出現在CDATA部分或註釋中。但是你只需要冒險,然後拆分文件,看看"<?xml"出現在哪裏,希望是最好的,並且如果錯誤發生了,就責怪那些提出這個想法的人。唯一的選擇是爲這個XML變體編寫你自己的解析器,這不會太有趣。

相關問題