这不是作业;我的单元测试需要这个。
样本输入:<rows><row><a>1234</a><b>Hello</b>...</row><row>...</rows>
。
样本输出:<rows><row><a>0.0</a><b>0.0</b>...</row><row>...</rows>
。
您可以假设文档以<rows>
开头,并且该父节点具有名为<row>
的子节点。你不知道节点a
,b
等的名称。
额外的功劳:如何使用任意格式良好的“自由格式”XML来完成这项工作?
我用正则表达式尝试了这个:)没有运气。我可以说它“在右边不贪心”,但不在左边。谢谢你的帮助。
编辑:这是我尝试过的:
private static string ReplaceValuesWithZeroes(string gridXml)
{
Assert.IsTrue(gridXml.StartsWith("<row>"), "Xml representation must start with '<row>'.");
Assert.IsTrue(gridXml.EndsWith("</row>"), "Xml representation must end with '<row>'.");
gridXml = "<deleteme>" + gridXml.Trim() + "</deleteme>"; // Fake parent.
var xmlDoc = XDocument.Parse(gridXml);
var descendants = xmlDoc.Root.Descendants("row");
int rowCount = descendants.Count();
for (int rowNumber = 0; rowNumber < rowCount; rowNumber++)
{
var row = descendants.ElementAt(0);
Assert.AreEqual<string>(row.Value /* Does not work */, String.Empty, "There should be nothing between <row> and </row>!");
Assert.AreEqual<string>(row.Name.ToString(), "row");
var rowChildren = row.Descendants();
foreach (var child in rowChildren)
{
child.Value = "0.0"; // Does not work.
}
}
// Not the most efficient but still fast enough.
return xmlDoc.ToString().Replace("<deleteme>", String.Empty).Replace("</deleteme>", String.Empty);
}
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach (XmlElement el in doc.SelectNodes("//*[not(*)]"))
el.InnerText = "0.0";
xml = doc.OuterXml;
或者对非空文本节点更具选择性:
foreach (XmlText el in doc.SelectNodes("//text()[.!='']"))
el.InnerText = "0.0";
XDocument xml = XDocument.Load(myXmlFile);
foreach (var element in xml.Descendants("row").SelectMany(r => r.Elements()))
{
element.Value = "0.0";
}
请注意,这种对“Desscendants('row')”的一般搜索效率不高 - 但它满足'任意格式'的要求。
你应该看看HTML Agility Pack。它允许您将html文档视为格式良好的xml,因此您可以解析它并更改值。
我认为你可以在C#中使用Regex.Replace方法。我使用下面的正则表达式替换所有XML元素值:
[>]+[a-zA-Z0-9]+[<]+
这基本上匹配以'>'{some text alphabets or number}'<'
开头的文本。
我能够在Notepad ++中成功使用它。您也可以使用此编写一个小程序。