Java 如何读取包含单独 XML 的文本日志文件并提取 XML 块



Using Java

我有一个应用程序,它将收到的所有 XML 消息写入日志文件。 每条 XML 消息都通过 log4j 追加到日志文件中。

这应该适用于具有唯一文本块开头和结尾的任何类型的文本文件。 这并不具体。

每个日志文件中可能有数千条 XML 消息,并且每天都会创建新的日志文件。

我不需要将日志文件中的 XML 解析为它的元素,只需将日志文件中的每个 XML 消息(XML 块)拉取到 Java 中的内存变量中。 (从第一个标记到最后一个标记的整个 XML 块需要位于内存变量中)。

我将把这个XML发送到一个Web服务进行处理,就像今天从我们的中间件发送它的方式一样。

我已经有该部分来发送 XML,并且只要 XML 在日志文件中的一行上,我就可以处理文件,但应用程序中的 XML 编写器在某些情况下以缩进的新行格式编写 XML,因此需要能够从日志文件中提取 XML 消息块。

所以 -我需要从第一个标签读取日志文件中的 XML:

<?xml version='1.0' encoding='UTF-8'?>

直到最后一个标签的最后一个标签:

</MyXML>

无论文件中是否有回车符或空行,它都必须跳过无效行。

每个 XML 消息可以是小到非常大 - 很容易超过 20k。

XML日志文件将如下所示,并且每个 XML 消息或其他文本之间可能有空白行,如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<MyXML>
<Envelope documentType="SetProfile" trader="BEA" dtdRev="2.0" xid="03-JUL-17 14:38:49" traderLogin="middleware" traderPassword="abc123"/>
<Payload><SetProfile allowInvalidProfile="F">
<Partner publisherID="52725" act="Update">
<Contact languageCode="EN" firstName="Luis" lastName="Dini" email="Dini@email.com" act="Update" publisherID="ldini" securityRoleCode="6"/>
</Partner></SetProfile>
</Payload>
</MyXML>
<?xml version='1.0' encoding='UTF-8'?><MyXML><Envelope documentType="SetProfile" trader="BEA" dtdRev="2.0" xid="03-JUL-17 14:38:49" traderLogin="middleware" traderPassword="abc123"/><Payload><SetProfile allowInvalidProfile="F"><Partner publisherID="9857684" act="Update"><Contact languageCode="EN" firstName="Bill" lastName="Jones" email="Jones@email.com" act="Update" publisherID="BJones" securityRoleCode="3"/></Partner></SetProfile></Payload></MyXML>
======================
#]
<?xml version='1.0' encoding='UTF-8'?><MyXML><Envelope documentType="SetProfile" trader="BEA" dtdRev="2.0" xid="03-JUL-17 14:38:49" traderLogin="middleware" traderPassword="abc123"/>
<Payload><SetProfile allowInvalidProfile="F"><Partner publisherID="7465737" act="Update">
<Contact languageCode="EN" firstName="John" lastName="Smith" email="Smith@email.com" act="Update" publisherID="JSmith" securityRoleCode="3"/></Partner></SetProfile></Payload></MyXML>

简而言之,这将是一个工具,它将读取 XML 消息的日志文件并提取要转发到 Web 服务的每个单独的 XML 消息,类似于中间件今天创建和发送每个 XML 消息的方式。

这将用于批量测试和其他开发需求。

任何建议不胜感激。

一种简单的方法是将日志文件内容加载到 String 中,然后使用正则表达式,如下所示:

Pattern p = Pattern.compile(Pattern.quote("<?xml version='1.0' encoding='UTF-8'?>") + ".*?" + Pattern.quote("</MyXML>"));
Matcher m = p.matcher(allText);
while (m.find()) {
System.out.println(m.group());
}

最新更新