2012-03-27 70 views
0

我有一個大的XML文件,它看起來像這樣:刪除無效數據和分割XML

 20120124 07:30:15.301, saving to queue 
<logmessage> 
    <logline1>some data</logline1> 
    <logline2>some data too</logline2> 
</logmessage> 

    20120124 07:30:15.302, processing message 
<logmessage> 
    <logline1>some data</logline1> 
    <logline2>some data too</logline2> 
</logmessage> 

我想將它拆分成多個文件,每個文件包含一個的LogMessage,我不想讓任何數據在根節點之外。我怎樣才能做到這一點?

回答

0

要小心你想要的。考慮你正在做什麼的後果。如果這是一個非常大的XML文件,如您所說,這將在您的目錄中創建大量的小文件。這在很多方面都可能很糟糕。在今天的大型文件系統中,每個塊至少會佔用最大的塊大小。每個將在linux上使用一個有限資源的inode,使用df -i來確定您是否有足夠的可用資源。最後,如果在同一個目錄中創建的文件太多,某些文件系統就會有限制或開始執行得不好。

下面將告訴你有多少文件將被創建:

perl -e '$/="</logmessage>";while(<>) {$i++};print $i,"\n"' log.xml 

下面創建一個使用帶有.xml擴展名的文件名的日期和時間的新文件。如果多個消息具有相同的時間戳,它們將被追加。

perl -e '$/="</logmessage>";while(<>) {m{([\d:\. ]+)};open(fh,">>","$1.xml");s{^.*?(?=<logmessage>)}{}sm;print fh $_,"\n";close fh}' log.xml 

另外要注意,許多XML庫將嘗試打開內存中的完整文件,可以是一個非常大的XML文件中的問題。此過程不會嘗試打開內存中的整個文件。如果您的文件太大而不適合內存,請不要接受任何使用非SAX或流式傳輸的XML解析器的解決方案。使用DOM解析器將需要的內存等於文檔大小乘以倍數的開銷。

0

如果你這樣做,你想使用基於SAX的解析器。試圖將這個加載到DOM並從那裏拆分信息將是徒勞無益的。

0

尋求幫助來處理「大型」XML文件就像說你需要幫助設計一座跨過「寬闊」河的橋。當我問人「有多大?」時,我的答案範圍從10Mb到100Gb。它有所作爲。

另一件不清楚的問題是我們是否正在處理格式良好的XML。你說它是XML,但你也提到無效的數據。處理格式良好的XML的解決方案可能與處理不是XML的數據非常不同。