我有一个具有以下结构的日志文件。
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。
感谢。
答案 0 :(得分:0)
您可以使用内置于java中的xml解析器,但您必须仅为它们提供XML作为输入。因此,您应该将XML的文件部分读入String,然后将它们解析为字符串。如果您不知道如何将字符串解析为XML,请参阅此处:In Java, how do I parse XML as a String instead of a file?
答案 1 :(得分:0)
我赞成其中一个基于StAX的解析器,Woodstox解析器特别有效。如果您需要使用不同类型的XML解析器,则可以将事件从解析器分流到生成器,并将该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()进行反对,在这种情况下,您必须计算解析文档的事件级别,并在到达根级别结束元素时将其分解。此外,一些解析器可能会在文档结束后缓存几个字符...最糟糕的情况是,当解析器在结束元素之后注意文本时,您只需捕获“格式错误”文档的异常