如何使用Java和SAX解析带有偶然XML标记的纯文本文件?

时间:2012-02-07 19:51:56

标签: java xml parsing plaintext

我有一个来自服务器的相当大的日志文件,其中包含纯文本。服务器记录它所做的每件事,偶尔会打印出我感兴趣解析的xml标签。举个例子:

-----------log file-------------
bla bla bla random text
<logMessage>test Message</logMessage>
some more random server output
<logMessage>some other message</logMessage>
bla bla bla
end of log file

我只想从&lt;中提取数据。 logMessage&gt;标签并忽略其余部分。我正在使用Java和SAX,但是SAX解析器期望文件的内容严格地是XML格式的,并且它无法处理这种类型的文件。有没有办法告诉SAX忽略/忽略文件不是格式良好的XML的事实? 有什么选择?逐行读取文件并查找标签? :(

2 个答案:

答案 0 :(得分:1)

为简单起见,我会选择逐行阅读文件并查找<logMessage></logMessage>令牌。请注意,您可以创建一个这样的通用解析器,它使用委托解析器并为其提供类似SAX的事件。 (可能有用,具体取决于重写解析器的工作量,现在基于SAX的解决方案结果不起作用。)

编辑:如果您对多种元素感兴趣,则委托方法也很有用。如果这些碰巧具有复杂(嵌入式)XML层次结构,您甚至可以将开始和结束标记之间的所有字符整理到缓冲区中,然后将该缓冲区提供给真正的 SAX解析器。在大多数情况下,这样做太过分了,但是,如果你有基本上包含XML转储的日志,那么它可能比尝试自己解析它更合适。

答案 1 :(得分:0)

我认为直接的XML解析不适合解析这种文件。如果行中包含所有XML片段(开始和结束标记位于同一行),则逐行读取并检查标记是否存在,跳过非XML行将是最简单的方法。跳过非XML行后,您可以将流传递给SAX解析器,或者只是逐行使用regexp。

基本上上面的方法与首先grepping文件只留下XML标签相同,然后将其包装在根元素中以制作格式良好的XML并解析它。