我正在编写一个函数,它将解析一个类似于遗留系统中的XML文件的文件。
....
<prod pid="5" cat='gov'>bla bla</prod>
.....
<prod cat='chi'>etc etc</prod>
....
.....
我现在有这个代码:
buf = Regex.Replace(entry, "<prod(?:.*?)>(.*?)</prod>", "<span class='prod'>$1</span>");
在决定我们还想显示类别之前,它工作得很好。
问题是,类别是可选的,我需要通过SQL查询运行类别缩写来检索类别的全名。
,
SELECT * FROM cats WHERE abbr='gov'
最终输出应该是:
<span class='prod'>bla bla</span><span class='cat'>Government</span>
我该怎么做呢?
注1:该功能已经完成(除了这一部分),并工作良好。注2:不能使用XML库,必须使用regex
Regex.Replace
有一个过载,它接受一个MatchEvaluator
,这基本上是一个Func<Match, string>
。因此,您可以动态地生成一个替换字符串。
buf = Regex.Replace(entry, @"<prod(?<attr>.*?)>(?<text>.*?)</prod>", match => {
var attrText = match.Groups["attr"].Value;
var text = match.Groups["text"].Value;
// Now, parse your attributes
var attributes = Regex.Matches(@"(?<name>w+)s*=s*(['""])(?<value>.*?)1")
.Cast<Match>()
.ToDictionary(
m => m.Groups["name"].Value,
m => m.Groups["value"].Value);
string category;
if (attributes.TryGetValue("cat", out category))
{
// Your SQL here etc...
var label = GetLabelForCategory(category)
return String.Format("<span class='prod'>{0}</span><span class='cat'>{1}</span>", WebUtility.HtmlEncode(text), WebUtility.HtmlEncode(label));
}
// Generate the result string
return String.Format("<span class='prod'>{0}</span>", WebUtility.HtmlEncode(text));
});