0

我有一个具有以下结构的日志文件。

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中需要它。

谢谢。

4

2 回答 2

0

您可以使用内置于 java 中的 xml 解析器,但您必须只给它们 XML 作为输入。因此,您应该将部分 XML 文件读入字符串,然后将它们解析为字符串。如果您不知道如何将字符串解析为 XML,请参阅此处:在 Java 中,如何将 XML 解析为字符串而不是文件?

于 2012-09-10T20:18:33.923 回答
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() ,在这种情况下,您将不得不计算事件级别解析文档并在到达根级别结束元素时中断。此外,一些解析器可能会在文档结束后缓存一些字符......最坏的情况是,当解析器注意到结束元素之后的文本时,您只需要捕获“格式错误”文档的异常

于 2012-09-10T20:42:32.347 回答