0
<?xml version="1.0" encoding="utf-8"?>
 <configSections>
    ----------
    ----------
 </configSections>
 <appSettings>
     <add key="Name" Value="XXX">
     <add key="Age" Value="10">
     <!--<add key="Number" value="5"/>--><!--uncomment it-->
     <!--<add key="Class" value="10"/>-->
 </appSettings>

我想取消注释第一个注释行。

到目前为止,这是我的代码:

foreach (XmlElement xElement in xmlDoc.DocumentElement)
{
    if (xElement.Name == "appSettings")
    {
        foreach (XmlNode xNodes in xElement.ChildNodes)
        {
            if (xNodes.NodeType == XmlNodeType.Comment)
            {
                if (xNodes.InnerText.Contains("Number"))
                {
                    // Now the commented line is in xNodes.InnerText.
                    // How can i add this line in that xml file under appSettings?
                }
            }
        }
        break;
    }
}
4

3 回答 3

1

您可以使用以下代码:

var appSettingsNode = xmlDoc.DocumentElement
                            .ChildNodes
                            .Cast<XmlNode>()
                            .FirstOrDefault(x => x.Name == "appSettings");

if(appSettingsNode == null)
    return;

var commentedNodes = appSettingsNode.ChildNodes
                                    .Cast<XmlNode>()
                                    .Where(x => x.NodeType == XmlNodeType.Comment
                                                && (x.InnerText.Contains("Number")
                                                    || x.InnerText.Contains("Class")))
                                    .ToList();

foreach(var commentedNode in commentedNodes)
{
    var tmpDoc = new XmlDocument();
    tmpDoc.LoadXml(commentedNode.InnerText);
    appSettingsNode.ReplaceChild(xmlDoc.ImportNode(tmpDoc.DocumentElement, true),
                                 commentedNode);

    // Use this instead if you want to keep the commented line:
    // appSettingsNode.AppendChild(xmlDoc.ImportNode(tmpDoc.DocumentElement, true));
}

重要的部分是foreach循环内部的部分。
在这里,我们将注释节点加载到一个新的XmlDocument( tmpDoc) 中,以将其作为“真实”XmlNode返回。然后我们只需将评论节点 ( commentedNode) 替换为新加载的节点 ( tmpDoc.DocumentElement)。

剩下的是你的原始代码,只是美化了。请注意我是如何通过用 LINQ 查询替换循环和 if 来降低圈复杂度的。

于 2012-08-31T07:30:59.457 回答
0

如果您想阅读名称键,您可以这样做:

string myUsername = System.Configuration.ConfigurationManager.AppSettings["Name"];
于 2012-08-29T11:00:29.067 回答
0

在 C# .net 中,您通常会使用System.Configuration.ConfigurationManager.AppSettings从配置文件中读取 appSetting。

如果您尝试从 web.config 中读取注释掉的行,那么您将不得不编写一些自定义代码来执行此操作。

这个答案应该给你一个良好的开端

于 2012-08-30T05:17:23.123 回答