繁体   English   中英

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

[英]How to replace all “values” in an XML document with “0.0” using C# (preferably LINQ)?

这不是家庭作业; 我的单元测试需要这个。

输入示例: <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> 您不知道节点ab等的名称。

值得一提的是:如何使用任意格式正确的“自由格式” 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 ++中成功使用它。 您也可以使用此程序编写一个小程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM