在开始和结束参数之间打印文件的内容

时间:2015-08-18 13:55:34

标签: java xml

我有一个包含很多东西的日志文件,其中包含我要提取的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();
        }
    }
}

当我被困住时,有人可以请点亮。

1 个答案:

答案 0 :(得分:1)

在这里你必须按顺序找到:

  • 包含固定字符串的3行(<?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();
        }
    }
}