2012-09-10 203 views
0

我有一個具有以下結構的日誌文件。以Java解析日誌文件的庫

unstructured raw text 
unstructured raw text 
.. 
.. 
.. 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<message> 
... 
... 
</message> 

unstructured raw text 
.. 
.. 


<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<message> 
... 
... 
</message> 

unstructured raw text 
.. 
.. 

正如你所看到的,在單個日誌文件中嵌入了多個XML文檔。我想知道是否有一個通用實用程序或庫可以在我開始寫自己的東西之前在這裏重用。我需要它在Java中。

謝謝。

+2

該設計將使你的生活比它所需要的要難得多。如果你想使用XML和XML工具鏈,那麼你應該接受它。停止在頂層嵌入原始文本,而是使整個文件成爲單個XML文檔。它會使你的解析生活變得更加容易。 –

+0

@Hank - 我沒有寫這個文件。我從另一個系統獲取文件。我需要解析它並使用我係統中XML節點內的一些信息。 –

+0

在這種情況下,祝你好運。你基本上會被卡住做一些醜陋的黑客手段:尋找''線,然後備份,直到你找到最後的結束標記,並刪除/忽略這兩個點之間的一切;之類的東西。老實說,如果有*任何*方式,你可以讓他們修復上游的文件格式,這將使你的工作更容易。 –

回答

0

我希望使用基於StAX的解析器之一,而Woodstox則特別有效。如果您需要使用不同類型的XML解析器,則可以將解析器中的事件分流到生成器,然後將該XML饋送到一個基於DOM的解析器或一個基於SAX的解析器(如果你是一個受虐狂......因爲SAX是一個使用解析器的痛苦)。

您將有僞代碼看起來有點像這樣:

BufferedReader br = ... 
XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
Pattern startOfXml = Pattern.compile("<\\?xml.*\\?>"); 
String line; 
while (null != (line = br.readLine()) { 
    if (startOfXml.matcher(line).matches()) { 
     XMLEventReader xr = inputFactory.createXMLEventFactory(br); 
     XMLEvent event; 
     while (!(event = xr.nextEvent()).isEndDocument()) { 
      // do whatever you want with the event 
     } 
    } else { 
     // do whatever you want with the plain-text 
    } 
} 

一些在特定模式下的StAX解析器可能反對isEndDocument(),並在這種情況下,你將不得不指望事件級別解析文檔並在達到根級別結束元素後突然崩潰。此外,一些解析器可能會在文檔結束後緩存幾個字符......最糟糕的情況是,當解析器在結束元素之後發現文本時,您只需要捕獲「畸形」文檔的異常