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

标签 java xml parsing logging text

使用Java

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

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

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

除了将日志文件中的每条 XML 消息(XML block )提取到 Java 中的内存变量中之外,我不需要将日志文件中的 XML 解析为其元素。 (从第一个标签到最后一个标签的整个 XML block 需要位于内存变量中)。

我将将此 XML 发送到 Web 服务进行处理,类似于今天从我们的中间件发送它的方式。

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

所以 - 我需要从第一个标签读取日志文件中的 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 消息的日志文件并提取每个单独的 XML 消息以转发到 Web 服务,类似于现在中间件创建和发送每个 XML 消息的方式。

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

如有任何建议,我们将不胜感激。

最佳答案

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

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());
}

关于Java 如何读取包含单独 XML 的文本日志文件并提取 XML block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44934996/

相关文章:

c# - 对包含索引的多行进行分组并为每个索引创建自定义对象列表

java - 并行流调用 Spliterator 的次数超过其限制

xml - 如果我将 XML 从具有 "xmlns"更改为不具有 "xmlns"是否会破坏兼容性?

xml - Visual Studio 在 VB 中对 CDATA XML block 的可怕着色。

android - 即使使用 InputStream,如何获得可靠且有效的 APK 文件 list 内容?

python - 使用 StanfordParser 从已解析的句子中获取类型依赖项

java - Android - 事务 - 任务尚未完成

java - 如何用Java读取CSV文件然后通过AES算法加密

java - 私有(private)成员可通过公共(public)方法访问

java - 在 Android 中的第二个 Activity 中添加了一个返回第一个 Activity 的按钮。现在,导航到第二个 Activity 时应用程序崩溃