Java如何读取包含单独XML的文本日志文件并提取XML块
使用Java 我有一个应用程序,它将接收到的所有XML消息写入日志文件。每个XML消息都由log4j附加到日志文件中 这适用于任何类型的文本文件,该文件具有唯一的文本块开头和结尾。这并不具体 每个日志文件中可能有数千条XML消息,并且每天都会创建新的日志文件 我不需要将日志文件中的XML解析为它的元素,只需要将日志文件中的每个XML消息(XML块)拉入Java中的内存变量。(从第一个标记到最后一个标记的整个XML块需要在内存变量中) 我将把这个XML发送到一个Web服务,以类似于今天从我们的中间件发送过来的方式进行处理 我已经有了发送XML的部分,只要XML在日志文件中的一行上,我就能够处理文件,但是应用程序中的XML编写器在某些情况下以缩进新行格式编写XML,因此需要能够从日志文件中提取XML消息块 因此-我需要从第一个标记读取日志文件中的XML:Java如何读取包含单独XML的文本日志文件并提取XML块,java,xml,parsing,logging,text,Java,Xml,Parsing,Logging,Text,使用Java 我有一个应用程序,它将接收到的所有XML消息写入日志文件。每个XML消息都由log4j附加到日志文件中 这适用于任何类型的文本文件,该文件具有唯一的文本块开头和结尾。这并不具体 每个日志文件中可能有数千条XML消息,并且每天都会创建新的日志文件 我不需要将日志文件中的XML解析为它的元素,只需要将日志文件中的每个XML消息(XML块)拉入Java中的内存变量。(从第一个标记到最后一个标记的整个XML块需要在内存变量中) 我将把这个XML发送到一个Web服务,以类似于今天从我们的中间
<?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消息的方式
这将用于批量测试和其他开发需求
非常感谢您的建议。一种简单的方法是将日志文件内容加载到字符串中,然后使用正则表达式,如下所示:
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());
}
Pattern p=Pattern.compile(Pattern.quote(“”+“*?”+Pattern.quote(“”));
匹配器m=p.Matcher(所有文本);
while(m.find()){
System.out.println(m.group());
}
一种简单的方法是将日志文件内容加载到字符串中,然后使用正则表达式,如下所示:
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());
}
Pattern p=Pattern.compile(Pattern.quote(“”+“*?”+Pattern.quote(“”));
匹配器m=p.Matcher(所有文本);
while(m.find()){
System.out.println(m.group());
}