有这样的一个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><BEGIN_TESTCASE>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><Owner>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>中的内容怎样用正则分割字符串问题?
<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><BEGIN_TESTCASE>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><Owner>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>中的内容怎样用正则分割字符串问题?
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("<", "<").replaceAll(">", ">") + "</LogMsg>");
}
这样写编译为什么是错误的,就是想匹配以时间<2010-05-08 18:55:29>开头以<End>结尾的字符串?
连在一起就是一个Java的\字符,在正则中和后面的字符一起组成一个正则的转义字符
<2010-05-08 18:55:29><Info><CASESTEP>1、输入符合下述条件的字符串作为Chap用户名:
a) 首字符是26个英文字母的任意字母;
b) 其它输入下划线和数字组合;
c) 长度在有效范围内;
2、输入合法的密码;
3、检查Chap用户是否创建成功。<End>