下面的函数定位文件,导航到指定的父节点,并遍历子节点以查找预定义的元素名称。
我正在读取XML文件并将节点内部文本值分配给静态字段,并且只希望选择某些节点,这些节点可能不一定是有序的,因为用户将被允许编辑XML配置文件。
目前我不得不按节点的顺序硬编码。外表不确定开关盒有什么问题,因为我认为这不重要 - 理想情况下我希望避免这种情况。
是否有更好的替代方案,或者我在切换机箱方面做错了什么?
我的代码:
public void ReadConfig()
{
string fp = _AppPath + @"\myfolder";
try
{
string confPath = (fp + @"\config.xml");
XmlDocument xDoc = new XmlDocument();
xDoc.Load(configfilepath);
XmlNode xmlLst = xDoc.SelectSingleNode("parentnode/childnode");
foreach (XmlNode node in xmlLst.ChildNodes)
{
switch(node.Name)
{
case "user":
_User = node.InnerText;
break;
case "password":
_Password = node.InnerText;
break;
case "serverip":
_serverIP = node.InnerText;
break;
case "mailport":
_mailPort = int.Parse(node.InnerText);
break;
case "recipient":
_recipient = node.InnerText;
break;
default:
WriteErrorLog("Issue getting server details from XML config file.");
break;
}
}
}
完全正常工作的解决方案
感谢您的帮助,以下是工作代码。
public static void ReadFromXMLXDoc()
{
// XDocument xDocu;
string xmlFilePath = (@"somewhere\Config.xml");
XDocument xDocu = XDocument.Load(xmlFilePath);
XElement xmlList = xDocu.Element("configuration").Element("parent").Element("child");
_one = (string)xmlList.Element("option1");
_two = (string)xmlList.Element("option2");
_three = (string)xmlList.Element("option3");
Console.WriteLine(_one + " " + _two + " " + _three);
Console.ReadLine();
}
答案 0 :(得分:1)
作为您当前方法的替代方案,您可以使用多个SelectSingleNode()
,如下所示:
XmlNode xmlLst = xDoc.SelectSingleNode("parentnode/childnode");
_User = xmlLst.SelectSingleNode("user").InnerText;
_Password = xmlLst.SelectSingleNode("password").InnerText;
....
或者您可以使用较新的XML API XDocument
而不是XmlDocument
尝试完全不同的路线:
XDocument xDoc = XDocument.Load(configfilepath);
Xelement xmlLst = xDoc.Element("parentnode").Element("childnode");
_User = (string)xmlLst.Element("user");
_Password = (string)xmlLst.Element("password");
....
答案 1 :(得分:0)
另一种替代方法是使用Dictionary<string, string>
,如下所示:
string confPath = (fp + @"\config.xml");
XmlDocument xDoc = new XmlDocument();
xDoc.Load(configfilepath);
XmlNode xmlLst = xDoc.SelectSingleNode("parentnode/childnode");
var nodeDict = xmlLst.ChildNodes.OfType<XmlNode>()
.ToDictionary(nodeKey => nodeKey.Name, nodeVal => nodeVal.InnerText);
现在是时候访问该值了。
var _User = nodeDict["user"];
// OR
Console.WriteLine(nodeDict["user"] + " " + nodeDict["password"] + " " + nodeDict["serverip"]);
//...... so on........