Switch Case Reading XML的替代方案

时间:2014-09-11 08:41:44

标签: c# xml switch-statement

下面的函数定位文件,导航到指定的父节点,并遍历子节点以查找预定义的元素名称。

我正在读取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();          
    }

2 个答案:

答案 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........