我不确定这是否可行,但......
我有一大块文本(kml格式,基本上是xml),它包含看起来像这样的代码段(大约75个)
<color>ff0780dd</color> *bgcolor
<th>MSOA11CD</th> *code
<td>E02001618</td>
我需要做的是,设置每个*代码不同的* bgcolor,一旦我有*代码,我可以在我的数据库中查看并分配正确的颜色。
我可以使用正则表达式来获取以“MSOA + 4chars”开头的每个*代码,但我如何编辑它上面的颜色代码呢?
干杯
答案 0 :(得分:0)
如果是XML,则可以使用LINQ to XML
// find nodes
XNamespace ns = "url....";
var doc = XDocument.Load("Test.xml");
var items =( from item in doc.Descendants(ns+"Document").Descendants(ns+"Item")
where CheckItem(item.Element(ns+"th").Value)
select item).ToList();
// update nodes
for (int i = 0; i < items.Count(); i++)
{
items[i].SetElementValue(ns + "color", GetColor(items[i].Value));
}
// saving updated xml
doc.Save("Test.xml");
答案 1 :(得分:0)
这是使用正则表达式的解决方案。此表达式的匹配将捕获示例中的COLOR标记和TH标记。
<color>[^<]+</color>\s*<th>MSOA(\w+)</th>
第一个捕获组包含4位数的MSOA代码。然后,您可以使用具有所需更新值的新标签替换整个匹配项。以下是我在LINQPad中测试过的C#示例。
void Main() {
string inputString = @"
<color>ff0780dd</color>
<th>MSOA11CD</th>
<td>E02001618</td>";
string result = Regex.Replace(inputString, @"<color>[^<]+</color>\s*<th>MSOA(\w+)</th>", new MatchEvaluator(ComputeReplacement), RegexOptions.IgnoreCase | RegexOptions.Multiline);
Console.Out.WriteLine(result);
}
public String ComputeReplacement(Match m) {
const int GRP_MSOA_CODE = 1;
string msoaCode = m.Groups[GRP_MSOA_CODE].Value;
string colorCode = "SOME COLOR CODE"; //Get the code to use between the "color" tags from your DB.
return String.Format("<color>{0}</color>\n<th>MSOA{1}</th>", colorCode, msoaCode);
}