2012-06-07 35 views
2

我有一個巨大的文本文件,我想寫一個程序,只能從文件中提取XML並保存。如何從純文本文件中提取嵌入的XML內容?

是否有一個直接的API或更好的解決方案,而不是分割/修剪從文件中讀取的字符串。

例:文件的 小部分:

#---------- #1 : ----------# 
<MSG_INFO> 
<message type="TextMessage" messageSelector="" originationTimestamp="" receiveTime="" jmsServerTimestamp="" jmsMsgExpiration=""> 
    <header JMSDestinationType="Generic" JMSDeliveryMode="2" /> 
    <properties> 
     <property name="messageTopic" type="String">xyz</property> 
    </properties> 
</message> 

BodyLength=1476 
<?xml version="1.0"?> 
<catalog> 
<book id="bk101"> 
    <author>Gambardella, Matthew</author> 
    <title>XML Developer's Guide</title> 
    <genre>Computer</genre> 
    <price>44.95</price> 
    <publish_date>2000-10-01</publish_date> 
    <description>An in-depth look at creating applications 
    with XML.</description> 
</book> 
<book id="bk102"> 
    <author>Ralls, Kim</author> 
    <title>Midnight Rain</title> 
    <genre>Fantasy</genre> 
    <price>5.95</price> 
    <publish_date>2000-12-16</publish_date> 
    <description>A former architect battles corporate zombies, 
    an evil sorceress, and her own childhood to become queen 
    of the world.</description> 
</book> 

+0

我不明白。你是說你有一個嵌入了XML'片段'的文本文件嗎? Java有多種可用於解析(格式良好)的XML的API。 –

+2

@AndrewThompson說的。 「只有XML」是什麼意思?你能舉一個簡單的例子嗎? –

+0

用戶是否要在輸入中輸入整個xml文件?然後CDATA吧! – Alfabravo

回答

1

正則表達式就是答案。

String[] newXml = xml.split("\\<\\?"); 
    ArrayList<String> xmlList = new ArrayList<>(Arrays.asList(newXml)); 
    for(int i = 0; i<xmlList.size();i++){ 
     if(!xmlList.get(i).contains("xml version=\"1.0\" encoding=\"UTF-8\"")){ 
      xmlList.remove(i); 
     } 

    } 
    for(int j = 0;j<xmlList.size();j++){ 
     xmlList.set(j, "<?"+xmlList.get(j)); 
     xmlList.set(j,xmlList.get(j).split("\\#")[0]); 
    } 


    return xmlList; 
+0

順便說一下,這隻給出文檔中的第一個XML。但我們總是可以使用遞歸技術來獲得所有這些。 – Piyush

+0

這是一個非飢餓的模式,如果文件在xml之前和之後包含原始文本,則會提取第一個xml文件。 ?將不會幫助你在那裏有一個解決方法。 –

0

考慮採取看看這些爲Java XML解析:

+0

這些都可以從文本文件(包含XML和普通文本)中提取xml嗎?謝謝 – Piyush

1

一般的XML文件是文本文件,所以要麼你有一個文件,它是XML,或者你有一個包含XML的多個片段的文件。

如果是前者,你需要了解XML處理(SAX,DOM等)來獲取XML文檔的結構化內容,然後就可以保存這些內容與它的結構。這在想要重新格式化XML文檔時很有用(嵌套標籤中的標籤或將所有內容放在一行上都是示例)。

如果是後者,則需要編寫解析器然後使用XML處理工具。第一個解析器將查找任何看起來是開放XML標記的東西,然後跟蹤標記在文本文件中的位置,計算後續的打開和關閉標記,直到它檢測到它離開最初標記的頂層嵌套爲止。然後,它需要將嵌入的文本塊傳遞給相應的XML解析工具,然後可以形成XML的表示視圖,然後可以將其重新處理迴文本以保存在文本中自己的文件。

當然,後者可以優化實際上並不解析XML它的開始,並已檢測結束分界後;但是,如果不實際解析XML,則不能保證所得到的文本塊實際上是有效的XML。

相關問題