2012-09-10 149 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(),并在这种情况下,你将不得不指望事件级别解析文档并在达到根级别结束元素后突然崩溃。此外,一些解析器可能会在文档结束后缓存几个字符......最糟糕的情况是,当解析器在结束元素之后发现文本时,您只需要捕获“畸形”文档的异常