java - 将日志文件编码到 xml 文件 - Java

标签 java xml

我有一个包含以下输出的日志文件:

2226:org.powertac.common.TariffSpecification::6::new::1::CONSUMPTION
2231:org.powertac.common.Rate::7::new
2231:org.powertac.common.Rate::7::withValue::-0.5
2232:org.powertac.common.Rate::7::setTariffId::6
2232:org.powertac.common.TariffSpecification::6::addRate::7
2233:org.powertac.common.Tariff::6::new::6
2234:org.powertac.common.TariffSpecification::8::new::1::INTERRUPTIBLE_CONSUMPTION
2234:org.powertac.common.Rate::9::new
2234:org.powertac.common.Rate::9::withValue::-0.5
2235:org.powertac.common.Rate::9::setTariffId::8

解析文件后,具有以下模式:

<id>:<full_classname>::<order_of_execution>::<new_or_method>::<params>

解析器工作得很好,并且达到了我的预期。现在,我的目标是将相同的指令编码为 XML文件。我对这种任务完全陌生。 所以,XML必须同时包含 new对象和methods称呼。 我知道使用Reflection API 我会使用<full_classname>创建该类的对象:

Class<?> cl = Class.forName( className );

我怎样才能生成这样的XML文件 Class目的?我是否必须有一个数据结构或一种方法来获取对象的所有方法和字段并将它们写入 xml 文件?我知道 Reflection API 有这样的方法,但我需要一个更一般/示例的想法来了解如何完成我的任务。 我开始写下这个方法,但我不确定它是如何工作的:

// would send in the object to be marshalled. 
public void toXML(Object obj){
        try {
            JAXBContext context = JAXBContext.newInstance(Object.class);
            Marshaller m  = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        } catch (JAXBException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这是解析文件的示例:

171269 org.powertac.common.Order 171417 new 4
171270 org.powertac.common.Order 171418 new 4
171271 org.powertac.common.Order 171419 new 4

parse方法如下:

public void parse() throws ClassNotFoundException{
    try{
        //
        // assure file exists before parsing
        //
        FileReader fr = new FileReader( this.filename );
        BufferedReader textReader = new BufferedReader( fr );
        String line;
        File input = new File("test.xml");
        //Integer id = 1;
        while(( line = textReader.readLine()) != null ){
            Pattern p = Pattern.compile("([^:]+):([^:]+)::([\\d]+)::([^:]+)::(.+)");
            Matcher m = p.matcher( line );
            if (m.find()) {
              int id = Integer.parseInt(m.group(1));
              String className = m.group(2);
              int orderOfExecution = Integer.valueOf( m.group( 3 ));
              String methodNameOrNew = m.group(4);
              String[] arguments = m.group(5).split("::");
              //
              // there is the need to create a new object
              //
              if( methodNameOrNew.compareTo( "new" ) == 0 ){
                  //
                  // inner class
                  //
                  if( className.contains("$") == true){
                      continue;

                  }
                  else if( className.contains("genco")){
                      continue;
                  }
                  System.out.println("Loading class: " + className);
                  LogEntry le = new LogEntry(id, className, orderOfExecution, methodNameOrNew, arguments.toString());

                  Serializer ser = new Persister();
                  ser.write(le, input);
                  id++;
                  System.out.printf("%s %s %d %s %d\n", id, className, orderOfExecution, methodNameOrNew, arguments.length);
              }

        }

        }
        textReader.close();
    }
    catch( IOException ex ){
        ex.printStackTrace();
    }
    catch( ArrayIndexOutOfBoundsException ex){
        ex.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void write() throws Exception{
        File file = new File("test.xml");
        Serializer ser = new Persister();
        for(LogEntry entry : entries){
            ser.write(entry, file);
        }
    }

最佳答案

这是使用 Simple XML 的第一次尝试图书馆:

@Default()
public class LogEntry
{
    private int id;
    private Object classInstance;
    private String orderOfExecution;
    private String newOrMethod;
    private String params;

    // throws 'Exception' only for testing
    public LogEntry(int id, String className, String orderOfExecution, String newOrMethod, String params) throws Exception
    {
        this.id = id;
        this.classInstance = Class.forName(className).newInstance();
        this.orderOfExecution = orderOfExecution;
        this.newOrMethod = newOrMethod;
        this.params = params;
    }


    // getter / setter 
}

以及如何从类 LogEntry 中生成 XML:

// Here is an example of an entry
LogEntry le = new LogEntry(3, "com.example.MyClass", "abc", "def", "ghi");

Serializer ser = new Persister();
ser.write(le, new File("test.xml"));

简单的 XML 非常易于使用,请参阅此处 tutorialsexamples 。 您可以使用 LogEntry 类中的注释自定义整个 XML,但是您也可以让 @Default() 为您完成所有操作:-)

关于java - 将日志文件编码到 xml 文件 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165960/

相关文章:

java - java中将ResultSet转换为HashMap的List

Java - protected 'getters' 与嵌套类

html - 如何在 VIM 中注释掉 HTML/XML 元素?

iphone - iPhone 上的 XML 和 SQLite 内存利用率和性能

java - 如何使用 Java 从 SOAP 响应中检索元素值?

java.sql 与 mysql.jdbc

java - 使特定组件在 Scrollable JPanel 中可见

java - 如何在派生类中共享方法而不包含在基类中

java - 使用 javax.xml 添加新 POJO 时出现 ClassCastException

c# - XmlSerializer 用问号替换非 ASCII 字符 '?'