/**
题目详情
挑战规则:
1、xml分为三级,一级为大类,二级为实体,三级为属性 2、三级之间用换行间隔,每级间开始用缩格。 3、二级对象后间隔一个空格,并输出对象所在xml中的顺序号 4、第三级顺序输出属性名称和属性值,属性名和属性值间用:间隔 5、输入格式: 输入为单一xml格式字符串,其中带有"字符。可能带有回车换行符。 6、输出格式: 输出数据中不带"字符,输出格式中的每行开头使用Tab字符作为缩进。每行结尾使用回车换行符作为结束 7、属性名字不包含引号和等号,不包含大于小于等特殊字符。 8、不能使用语言之外的开源库。
*/
import java.util.regex.Pattern;
public class XMLparse{
public static String ParsingXML(String in)
{
String regEx_script = "<\\?xml[^>]*?>"; //去掉xml 版本说明 正则表达式
String regEx_style = "<|/";//去掉 < 或者 / 正则表达式
String regEx_xml ="</[^>]+>"; //去掉所有的结束标签
String regEx_gt = ">";
String xmlStr = in; //含xml标签的字符串
java.util.regex.Pattern p_script;
java.util.regex.Matcher m_script;
p_script = Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(xmlStr);
xmlStr = m_script.replaceAll(""); //过滤 xml 声明标签
p_script = Pattern.compile(regEx_xml,Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(xmlStr);
xmlStr = m_script.replaceAll(""); //过滤 所有的结束标签 例如 </span>
p_script = Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(xmlStr);
xmlStr = m_script.replaceAll(""); //过滤 开始标签的 "<" 或者 但标记 标签的 "/"
p_script = Pattern.compile(regEx_gt,Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(xmlStr);
xmlStr = m_script.replaceAll("\n"); //过虑掉开始标签 ">" 然后 替换 一个\N 实现换行
xmlStr= xmlStr.replaceAll("=",":");
return format(xmlStr) ;
}
public static String format(String in){
int count=0;
String[] result =in.split("\\n");
StringBuffer text=new StringBuffer(result[0]);
String[] attr=null;
String str="";
for(int i=1;i<result.length;i++){
if(i%2!=0){
count++;
text.append("\n\t"+" "+result[i]+" "+count);
}else{
//将属性字符串进行切割
//可解析任意多个属性
attr=result[i].split("\"");for(int t=0;t<attr.length;t++){
str+=attr[t].trim();
if(t%2!=0){
text.append("\n\t\t"+str);
str="";
}
}
}
}
return text.toString();
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[])
{
// 冤啊!!!!!!!
//测试结果跟答案一样,为什么提交代码你们就说无法解析?????
//到底是不是坑人啊你们???
///你们要人家解析的那条xml 字符窜双引号是否已经转义??????
//如果没有的话还解析个屁呀!!!!坑人呀!!坑人呀!!
String in= "<?xml version=\"1.0\" ?><Books><Book>< age=\"1\" Name =\"The C++ Programming Language\" Author=\"Bjarne Stroustrup\" /></Book><Book><Name = \"Effective C++\" Author = \"Scott Meyers\"/></Book></Books>";
System.out.println(ParsingXML(in));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}
测试结果如下:
明明解析出来了