有这样的一个txt文件想把它转换成XML字符串,txt文档每行都具有一定的格式,例如
<2010-05-08 18:55:29><Info><BEGIN_TESTCASE>CONFIG_CHAP_0014<End>
<2010-05-08 18:55:29><Info>脚本 D:/Prj/Scripts/CONFIG_CHAP_0014.tcl 第 1 次运行<End>
<2010-05-08 18:55:29><Info><Owner>None<End>
<2010-05-08 18:55:29><Info><Times=1><End>
<2010-05-08 18:55:29><Warn>Warning! Lack deviceInfo!<End>
<2010-05-08 18:55:29><Warn>Warning! Lack preHandleRestore!<End>
以日期开头,以<End>结尾,希望转换成
<?xml version="1.0" encoding="UTF-8"?>
<Logs>
<Log>
<LogTime>2010-05-08 18:55:29</LogTime>
<LogLevel>Info</LogLevel>
<LogMsg>&lt;BEGIN_TESTCASE&gt;CONFIG_CHAP_0014</LogMsg>
</Log>
<Log>
<LogTime>2010-05-08 18:55:29</LogTime>
<LogLevel>Info</LogLevel>
<LogMsg>脚本 D:/Prj/Scripts/CONFIG_CHAP_0014.tcl 第 1 次运行</LogMsg>
</Log>
<Log>
<LogTime>2010-05-08 18:55:29</LogTime>
<LogLevel>Info</LogLevel>
<LogMsg>&lt;Owner&gt;None</LogMsg>
</Log>
</Logs>
我觉得大概是先读文件,按行读,但是也有多行的情景,例如
<2010-05-08 18:55:29><Info><CASESTEP>1、输入符合下述条件的字符串作为Chap用户名:
  a) 首字符是26个英文字母的任意字母;
  b) 其它输入下划线和数字组合;
  c) 长度在有效范围内;
  2、输入合法的密码;
  3、检查Chap用户是否创建成功。<End>
除了按行读还要判断是否以<End>结尾,然后分别取到时间<2010-05-08 18:55:29>,级别<Info>和内容<CASESTEP>1、输入符合下述条件的字符串作为Chap用户名:
  a) 首字符是26个英文字母的任意字母;
  b) 其它输入下划线和数字组合;
  c) 长度在有效范围内;
  2、输入合法的密码;
  3、检查Chap用户是否创建成功。
这些信息,分别封装成XML的节点<LogTime>,<LogLevel>,<LogMsg>中的内容怎样用正则分割字符串问题?

解决方案 »

  1.   


    public static void main(String[] args) throws Exception{
     
    String s = "<2010-05-08 18:55:29><Info><BEGIN_TESTCASE>CONFIG_CHAP_0014<End>".replaceAll("<End>","");
    String tmp = s;
    Pattern p = Pattern.compile("<.*?>",Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(s);
    int i = 0;

    while(m.find()){
    i++;
    String str = m.group();
    if(i == 1){
    System.out.println("<LogTime>" + str.replaceAll("<|>", "") + "</LogTime>");
    tmp = tmp.replaceAll(str, "");
    }
    if(i == 2){
    System.out.println("<LogLevel>" + str.replaceAll("<|>", "") + "</LogLevel>");
    tmp = tmp.replaceAll(str, "");
    }

     
    }
    System.out.println("<LogMsg>" + tmp.replaceAll("<", "&lt;").replaceAll(">", "&gt;") + "</LogMsg>");

    }
      

  2.   

    Pattern p = Pattern.compile("<([0-9\:\- ]+)><([a-zA-Z]+)>(.*?)<End>",Pattern.CASE_INSENSITIVE);
    这样写编译为什么是错误的,就是想匹配以时间<2010-05-08 18:55:29>开头以<End>结尾的字符串?
      

  3.   

    Pattern p = Pattern.compile("<([0-9\\:\\- ]+)><([a-zA-Z]+)>(.*?)<End>",Pattern.CASE_INSENSITIVE);C系列语言中,字符串中\是转义符第一个红色的代表转义开始,后面一个代表转义的内容。
    连在一起就是一个Java的\字符,在正则中和后面的字符一起组成一个正则的转义字符
      

  4.   

    只看了编译错误部分,regex本身没理解
      

  5.   

    这个"<([0-9\\:\\- ]+)><([a-zA-Z]+)>(.*?)<End>"红色部分能否再改进一下,希望能够匹配换行符,因为存在多行的情况,如果不改进的话,一下这种情况就被筛选掉了!
    <2010-05-08 18:55:29><Info><CASESTEP>1、输入符合下述条件的字符串作为Chap用户名:
      a) 首字符是26个英文字母的任意字母;
      b) 其它输入下划线和数字组合;
      c) 长度在有效范围内;
      2、输入合法的密码;
      3、检查Chap用户是否创建成功。<End>
      

  6.   

    > 希望能够匹配换行符Pattern.compile(regex, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE),具体参数我一时记不起来,自己查一下