2009-10-29 263 views
4

我有一個文件,可以在短時間內更改它的內容。但是我想在它準備好之前閱讀它。問題是,它是一個xml文件(日誌)。所以當你閱讀它時,可能並非所有的標籤都被關閉。關閉所有打開的xml標籤

我想知道是否有正確關閉所有打開的標籤的可能性,不存在任何問題,以顯示它在瀏覽器(使用XSLT stylsheet)。這應該通過使用Python的包含功能。

回答

5

一些XML解析器允許是解析器可以開始處理文檔,而不需要它是完全加載XML文檔的增量解析。 Python標準庫中xml.etree.ElementTree模塊的XMLTreeBuilder就是這樣一個解析器:Element Tree

正如您在下面的示例中所看到的,您可以在您從輸入中讀取數據時將數據一點一點地提供給解析器資源。在處理程序類的適當掛鉤的方法將被調用時,各種XML「事件」發生(標籤開始,標籤數據讀取,標籤結束),讓您處理數據的XML文檔加載:

from xml.etree.ElementTree import XMLTreeBuilder 
class MyHandler(object): 
    def start(self, tag, attrib): 
     # Called for each opening tag. 
     print tag + " started" 
    def end(self, tag): 
     # Called for each closing tag. 
     print tag + " ended" 
    def data(self, data): 
     # Called when data is read from a tag 
     print data + " data read" 
    def close(self):  
     # Called when all data has been parsed. 
     print "All data read" 

handler = MyHandler() 

parser = XMLTreeBuilder(target=handler) 

parser.feed(<sometag>) 
parser.feed(<sometag-child-tag>text) 
parser.feed(</sometag-child-tag>) 
parser.feed(</sometag>) 
parser.close() 

在這個例子中,處理器會得到五個事件和打印:

sometag開始

sometag孩子開始

「文本」 數據讀取

sometag兒結束

sometag結束

所有數據讀取

0

通過向目前可用的數據提供數據,您可以使用任何SAX解析器。使用剛剛重建源XML的SAX處理程序,保持標記堆棧打開並在最後以相反的順序關閉它們。

1

如果我理解正確你的問題,你有一個總是被附加一個日誌文件,以使你得到的東西,如:

<root> 
<entry> ... </entry> 
<entry> ... </entry> 
... 
<entry> ... </entry 
<!-- no closing root --> 

在這種情況下,你不希望,因爲它試圖讀取一個完整的文件,將嗆缺少的標記使用DOM解析器。相反,SAX或Pull解析器可以工作,因爲它像一串數據而不是一個完整的樹讀取文檔。正如Denis上面所回答的那樣,您可以在結束時關閉缺失的標籤,或者在寫出之前忽略任何不完整的標籤。

XML parsing on Wikipedia

0

你可以使用BeautifulStoneSoup(BeautifulSoup的XML部分)。

www.crummy.com/software/BeautifulSoup

它的效果並不理想,但它會繞過這個問題,如果你不能修復該文件的輸出...

總的來說,這就是丹尼斯的先前版本實現說過。

你可以隨意加入任何你需要的湯,它會盡最大努力修復它。