如何使用C#(最好是LINQ)用"0.0"替换XML文档中的所有"值"?

Ham*_*jan 0 c# regex xml replace linq-to-xml

这不是作业; 我的单元测试需要这个.

样本输入:<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);
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        foreach (XmlElement el in doc.SelectNodes("//*[not(*)]"))
            el.InnerText = "0.0";
        xml = doc.OuterXml;
Run Code Online (Sandbox Code Playgroud)

或者对非空文本节点更具选择性:

        foreach (XmlText el in doc.SelectNodes("//text()[.!='']"))
            el.InnerText = "0.0";
Run Code Online (Sandbox Code Playgroud)