gpt4 book ai didi

c# - 向 XML 文件添加注释并使用 C# 读入

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:41 25 4
gpt4 key购买 nike

我正在开发一个 c# 控制台应用程序,它有一个包含程序设置的 xml 配置文件。

我想在 xml 文件中添加注释,以显示您可以使用 <!--My Comment--> 为特定设置使用哪些值.出于某种原因,当我把它放进去时,就好像 C# 认为这是文件的结尾并且没有读取文件的其他部分,没有抛出任何错误并且程序不会停止响应它继续运行其余部分的代码。

下面是配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<options>
<database>
<item key="server" value="localhost" />
<item key="database" value="emailserver" />
<item key="username" value="myusername" />
<item key="password" value="mypassword" />
<item key="port" value="3306" />
</database>
<EmailServer>
<item key="logFile" value="email_server.txt" />
<!--You can use fileCopy or database-->
<item key="logManageMode" value="fileCopy" />
<item key="ip_address" value="127.0.0.1" />
<item key="smtpPort" value="26" />
<item key="requireAuthentication" value="false" />
</EmailServer>
</options>

如果我不把那条评论放进去,它就会读入整个文件。下面是读取 XML 文件的代码。

public Dictionary<string, string> readConfig(string sectionName, bool soapService=false, Dictionary<string, string> config=null)
{
Dictionary<string, string> newConfig = null;
if (config == null)
{
newConfig = new Dictionary<string, string>();
}
//Dictionary<string, string> config = new Dictionary<string, string>();
try
{
XmlDocument configXml = new XmlDocument();
string configPath = "";
if (soapService)
{
string applicationPath = HttpContext.Current.Server.MapPath(null);
configPath = Path.Combine(applicationPath, "config.xml");
configXml.Load(configPath);
}
else
{
configXml.Load("config.xml");
}

XmlNodeList options = configXml.SelectNodes(string.Format("/options/{0}", sectionName));
XmlNodeList parameters = configXml.GetElementsByTagName("item");
foreach (XmlNode option in options)
{
foreach (XmlNode setting in option)
{
string key = setting.Attributes["key"].Value;
string value = setting.Attributes["value"].Value;

if (config == null)
{
newConfig.Add(key, value);
}
else
{
config.Add(key, value);
}
}
}
}
catch (KeyNotFoundException ex)
{
Console.WriteLine("Config KeyNotFoundException: {0}", ex.Message);
}
catch (XmlException ex)
{
Console.WriteLine("Config XmlException: {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Config Exception: {0}", ex.Message);
Console.WriteLine("StackTrace: {0}", ex.StackTrace);
}
if (config == null)
{
return newConfig;
}
return config;
}

感谢您提供的任何帮助。

最佳答案

您的评论是一个节点。所以当你遍历节点时:

 foreach (XmlNode option in options) 
{
foreach (XmlNode setting in option)
{
string key = setting.Attributes["key"].Value;
string value = setting.Attributes["value"].Value;

您在 commebnt 处触发了 try/catch block ,因为该节点不包含“key”或“value”属性。

您可以使用 NodeType属性来确定节点是否是注释。例如:

 foreach (XmlNode option in options) 
{
foreach (XmlNode setting in option)
{
if (setting.NodeType == XmlNodeType.Comment)
{
continue;
}
string key = setting.Attributes["key"].Value;
string value = setting.Attributes["value"].Value;

如果节点不是元素,另一种选择是继续:

if (setting.NodeType != XmlNodeType.Element)

根据 Tomalak:实际上,这与 OP 的原始代码一样脆弱。在 XML 中插入一个不同于注释的节点类型,它将再次爆炸。只需在循环内选择一个特定的 XmlNodeList: XmlNodeList settings = option.SelectNodes("item[@key and @value]");

关于c# - 向 XML 文件添加注释并使用 C# 读入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com