我有一个包含很多东西的日志文件,其中包含我要提取的xml消息并写入文件,如果在xml消息中我找到特定的字符串(transID)。
例如,这是一个我想要搜索字符串' TODPG201412041625130415'的文件,一旦找到它,我想抓住它们之间的所有内容:
<?xml version = "1.0" encoding = "ISO-8859-1" ?>
<SalesOrderAcknowledgement>
<HeaderData>
<TransID>TODPG201412041625130415</TransID>
和
</SalesOrderAcknowledgement>
文件:
05/12/2014 15:07:53 INFO [Search.java 445] - The Trans ID: TODPG201412041625130370 has already been processed.
05/12/2014 15:07:53 INFO [Search.java 316] - The message for Trans ID TODPG201412041625130370 was ALREADY CONSUMED. Consumed Original Message: <?xml version = "1.0" encoding = "ISO-8859-1" ?>
<SalesOrderAcknowledgement>
<HeaderData>
<TransID>TODPG201412041625130415</TransID>
<Description>Estimate</Description>
<SiteQueueName>TODPG</SiteQueueName>
<LineItems>5</LineItems>
<TimeStamp>201412041625130370</TimeStamp>
</HeaderData>
<SalesOrderDetail>
<SalesID>2002726862</SalesID>
</SalesOrderDetail>
<SalesOrderLineItems>
<LineItem>
<SalesLineNum>20</SalesLineNum>
<UnitPrice>0.4300</UnitPrice>
<BurdenRate>0.0000</BurdenRate>
<ExtendedPrice>0.00</ExtendedPrice>
<RecordStatus>A</RecordStatus>
<ErrorMessage1>Sales Order 2002726862 modified</ErrorMessage1>
<ErrorMessage2></ErrorMessage2>
<ErrorMessage3></ErrorMessage3>
</LineItem>
<LineItem>
<SalesLineNum>30</SalesLineNum>
<UnitPrice>3.6500</UnitPrice>
<BurdenRate>0.0000</BurdenRate>
<ExtendedPrice>0.00</ExtendedPrice>
<RecordStatus>A</RecordStatus>
<ErrorMessage1>Sales Order 2002726862 modified</ErrorMessage1>
<ErrorMessage2></ErrorMessage2>
<ErrorMessage3></ErrorMessage3>
</LineItem>
</SalesOrderLineItems>
</SalesOrderAcknowledgement>
05/12/2014 15:07:55 INFO [Search.java 232] - **** XML Message:
<?xml version = "1.0" encoding = "ISO-8859-1" ?>
<SalesOrderAcknowledgement>
<HeaderData>
<TransID>TODPG201412041635120944</TransID>
<Description>Estimate</Description>
<SiteQueueName>TODPG</SiteQueueName>
<LineItems>5</LineItems>
<TimeStamp>201412041635120944</TimeStamp>
</HeaderData>
<SalesOrderDetail>
<SalesID>2002720443</SalesID>
</SalesOrderDetail>
<SalesOrderLineItems>
<LineItem>
<SalesLineNum>10</SalesLineNum>
<UnitPrice>0.0870</UnitPrice>
<BurdenRate>0.0000</BurdenRate>
<ExtendedPrice>0.00</ExtendedPrice>
<RecordStatus>A</RecordStatus>
<ErrorMessage1>Sales Order 2002720443 modified</ErrorMessage1>
<ErrorMessage2></ErrorMessage2>
<ErrorMessage3></ErrorMessage3>
</LineItem>
</SalesOrderLineItems>
</SalesOrderAcknowledgement>
transID将始终不同,并且同一文件中可能有多个transID。
我到了打印字符串所在位置的位置,但我不知道如何从<?xml version = "1.0"
获取字符串......:
import java.util.ArrayList;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.*;
public class installation
{
public static String searchString = "TODPG201412041625130415";
public static void main(String args[])
{
final File folder = new File("C:/Users/Administrator/Desktop/Estimated_Acualized/LogBackup/2014");
listFilesForFolder(folder);
}
public static void listFilesForFolder(final File folder)
{
for (final File fileEntry : folder.listFiles())
{
findWord(searchString, fileEntry);
}
}
public static void findWord(String word, File file){
try
{
Scanner scanner = new Scanner(file);
int lineNum = 0;
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
lineNum++;
if(line.indexOf(searchString) > -1)
{
System.out.println("found string on line " +lineNum);
System.out.println(line);
}
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
当我被困住时,有人可以请点亮。
答案 0 :(得分:1)
在这里你必须按顺序找到:
<?xml version = "1.0"
,<SalesOrderAcknowledgement>
,<HeaderData>
)TODPG201412041625130415
)获得它们后,复制找到的行(除了第一行应该从<?xml...
开始),然后找到所有内容,直到找到</SalesOrderAcknowledgement>
如果您找到了开头并将所有内容复制到结尾,并且需要4个字符串的搜索模式(!copy),我会使用复制模式。在该部分中,如果您在下一行找到下一个字符串,则迭代并保存该行,并重置以在第一个错误时搜索第一个字符串
以下是对代码的有限修改,只是在错误上输出消息并将找到的文本复制到外面:
public class Installation {
private static String[] preIdents = {"<?xml version = \"1.0\"",
"<SalesOrderAcknowledgement>", "<HeaderData>", ""};
private static String postIdent = "</SalesOrderAcknowledgement>";
public static String searchString = "TODPG201412041625130415";
public static void main(String args[]) {
final File folder = new File("Z:/Documents/SO_test/2014");
preIdents[preIdents.length - 1] = searchString;
listFilesForFolder(folder);
}
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
findWord(searchString, preIdents, postIdent, fileEntry);
}
}
public static void findWord(String word, String[] pre, String post, File file) {
try {
Scanner scanner = new Scanner(file);
String[] prefix = new String[pre.length];
int status = 0;
boolean copy = false;
int lineNum = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
lineNum++;
if (copy) {
System.out.println(line);
if (line.indexOf(post) > -1) {
copy = false;
status = 0;
}
} else {
int index = line.indexOf(pre[status]);
if (index > -1) {
// System.err.println("found " + pre[status] + " on line " + lineNum); only for tests
prefix[status] = (status == 0) ? line.substring(index) : line;
if (++status == pre.length) {
prefix[status - 1] = line;
copy = true;
for (String p : prefix) {
System.out.println(p);
}
}
} else {
status = 0;
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}