C# 如何使用c在xml元素下添加一行#

C# 如何使用c在xml元素下添加一行#,c#,configuration-files,C#,Configuration Files,如果要读取名称密钥,请执行以下操作: foreach (XmlElement xElement in xmlDoc.DocumentElement) { if (xElement.Name == "appSettings") { foreach (XmlNode xNodes in xElement.ChildNodes) { if (xNodes.NodeType == XmlNodeType.Comment)

如果要读取名称密钥,请执行以下操作:

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;
    }
}
在C#.net中,通常使用
System.Configuration.ConfigurationManager.AppSettings
从配置文件中读取appSetting

如果您试图从web.config读取注释掉的行,那么您必须编写一些自定义代码来执行此操作

您可以使用以下代码:

string myUsername = System.Configuration.ConfigurationManager.AppSettings["Name"];
var-appSettingsNode=xmlDoc.DocumentElement
.ChildNodes
.Cast()
.FirstOrDefault(x=>x.Name==“appSettings”);
if(appsetingsnode==null)
返回;
var commentedNodes=appSettingsNode.ChildNodes
.Cast()
.Where(x=>x.NodeType==XmlNodeType.Comment
&&(x.InnerText.Contains(“数字”)
||x.InnerText.Contains(“类”))
.ToList();
foreach(commentedNodes中的var commentedNode)
{
var tmpDoc=new XmlDocument();
LoadXml(commentedNode.InnerText);
appSettingsNode.ReplaceChild(xmlDoc.ImportNode(tmpDoc.DocumentElement,true),
注释节点);
//如果要保留注释行,请使用此选项:
//appSettingsNode.AppendChild(xmlDoc.ImportNode(tmpDoc.DocumentElement,true));
}
重要的部分是
foreach
循环中的部分。
这里,我们将注释节点加载到一个新的
XmlDocument
tmpDoc
)中,以将其作为一个“真实的”
XmlNode
返回。然后,我们只需将注释节点(
commentedNode
)替换为新加载的节点(
tmpDoc.DocumentElement


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

您的意思是读取“Name”键吗?你说你想在appsettings元素下添加一个read行是什么意思?你想取消对该行的注释吗?真的很难理解。请重新表述你的问题。@danielhilgarth是的。我想取消注释。@grkkarthick:好的。请显示您到目前为止的代码。谢谢丹尼尔!!!很好,它工作得很好。我还有一个疑问。我怎样才能再加一把钥匙?我是否应该使用新键再次写入关于commentNode行@DanielHilgarth@grkkarthick:请检查更新。对于多个键,我们需要使用
foreach
循环,并稍微更改第二个LINQ查询。谢谢你。干得好。在过去的两周里,我一直在努力解决这个问题。我想commentedNodes变量中终于多了一个“')。@grkkarthick:修复了。问题不是循环中的
,而是循环头中相同变量
commentNode
的两个不同名称。
string myUsername = System.Configuration.ConfigurationManager.AppSettings["Name"];
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));
}