最近在学习xml的时候遇上这样一个问题。读取mp3信息然后录入到数据库中的xml字段。
然而mp3信息中,如在标题中存在这样一种特殊情况: 标题包含XML的特殊字符而导致输入出错.
如: Kill'em All 中的 ' You&Me 中的& 还有其他一些诸如'<' '>'等等.
利用正则表达式找出特殊字符
我们当然可以轻易地利用正则表达式查找出那些特殊字符并用Replace()替换掉他们, 如下:
using
System.Text.RegularExpressions;
public class Test
... {
static void Main(string[] args)
...{
string str = "<You're angle & evil>";
string result;
//假设特殊字符只有< > ' & 四种
string pattern = "<|>|'|&":
Regex regex = new Regex(pattern);
//假设我们只把他们都替换成 '_'
result = regex.Replace(str, "_");
Console.WriteLine(result);
}
}
// 结果很明显
_You_re angle _ evil_
public class Test
... {
static void Main(string[] args)
...{
string str = "<You're angle & evil>";
string result;
//假设特殊字符只有< > ' & 四种
string pattern = "<|>|'|&":
Regex regex = new Regex(pattern);
//假设我们只把他们都替换成 '_'
result = regex.Replace(str, "_");
Console.WriteLine(result);
}
}
// 结果很明显
_You_re angle _ evil_
按情况替换为不同的字符
但我遇到的问题是, 我可不想把他们简单的替换成一个没意义的下划线,我想把他们转化为xml能识别的格式。
不幸地,Replace可不直接提供替换为多个目标字符的功能。
于是, 我们可以用到一个叫MatchEvaluatord的类来帮我们解决问题。如下:
using
System.Text.RegularExpressions;
class Program
... {
static void Main(string[] args)
...{
string str = "<You're angle & evil>";
string pattern = "'|&|<|>";
Regex regex = new Regex(pattern);
Program prog = new Program();
MatchEvaluator evaluator = new MatchEvaluator(prog.ConvertToXML);
Console.WriteLine(regex.Replace(str, evaluator));
Console.Read();
}
//把正则表达式的匹配到的字符转换成xml能正常识别的标识
public string ConvertToXML(Match m)
...{
switch (m.Value)
...{
case "'":
return "&apos";
case "&":
return "&";
case "<":
return "<";
case ">":
return ">";
default:
return "";
}
}
}
class Program
... {
static void Main(string[] args)
...{
string str = "<You're angle & evil>";
string pattern = "'|&|<|>";
Regex regex = new Regex(pattern);
Program prog = new Program();
MatchEvaluator evaluator = new MatchEvaluator(prog.ConvertToXML);
Console.WriteLine(regex.Replace(str, evaluator));
Console.Read();
}
//把正则表达式的匹配到的字符转换成xml能正常识别的标识
public string ConvertToXML(Match m)
...{
switch (m.Value)
...{
case "'":
return "&apos";
case "&":
return "&";
case "<":
return "<";
case ">":
return ">";
default:
return "";
}
}
}
不知此法是否最佳, 还望各位赐教.