Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何读取包含单独XML的文本日志文件并提取XML块_Java_Xml_Parsing_Logging_Text - Fatal编程技术网

Java如何读取包含单独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服务,以类似于今天从我们的中间

使用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消息的方式

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


非常感谢您的建议。

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

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