从XML文件中读取节点属性

时间:2015-06-18 21:30:30

标签: c# xml

我有以下XML文件。

<?xml version="1.0" encoding="utf-8" ?>
<Countries>
    <Country>
        <Id>101</Id>
        <City>Austin</City>
    </Country>
    <Country>
        <Id>102</Id>
        <City>Dallas</City>
    </Country>
    <Country>
        <Id>103</Id>
        <City>Chicago</City>
    </Country>
    <Country>
        <Id>104</Id>
        <City>Aman</City>
     </Country>
</Countries>

我正试图从后面的代码中读取它。这是代码

List<City> cityList = new List<City>();
string url = "/App_Data/Countries.xml";
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(url));
XmlNodeList nodeList = doc.SelectNodes("Country");
foreach (XmlNode node in nodeList)
{
    if (node != null)
    {                        
        int id = int.Parse(node.Attributes["Country"].Value);
        string name = node.Attributes["City"].Value;
        City city = new City(id, name);
        cityList.Add(city);
    }
}

出于某种原因,下面的代码

XmlNodeList nodeList = doc.SelectNodes("Country");

根本不返回任何节点。

3 个答案:

答案 0 :(得分:2)

根据https://msdn.microsoft.com/en-us/library/hcebdtae(v=vs.110).aspx,这里有SelectNodes方法

  

选择与XPath表达式匹配的节点列表。

因为你这样做

XmlNodeList nodeList = doc.SelectNodes("Country");

您正在选择当前上下文中的所有<Country>元素,这是根,但<Country>元素实际上在<Countries>内,所以这就是为什么你根本没有节点。将上面的语法更改为此

XmlNodeList nodeList = doc.SelectNodes("Countries/Country");

以下是有关XPath表达式示例的更多信息:https://msdn.microsoft.com/en-us/library/ms256086%28v=vs.110%29.aspx

答案 1 :(得分:1)

如果您的目标是.NET 3.5或更高版本,我会考虑使用XDocument API而不是XmlDocument API(请参阅XDocument or XMLDocument)。

对于您的情况,实现将如下所示:

var cityList = new List<City>();            
XDocument xDoc = XDocument.Load(Server.MapPath("/App_Data/Countries.xml"));
foreach (XElement xCountry in xDoc.Root.Elements())
{
    int id = int.Parse(xCountry.Element("Id").Value);
    string name = xCountry.Element("City").Value;                
    cityList.Add(new City(id, name));
}

答案 2 :(得分:0)

谢谢大家。想通了。这是更新的代码。但我认为必须有一种比我更好的方式来填充对象。

  List<City> cityList = new List<City>();
            string url ="/App_Data/Countries.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath(url));
            XmlNodeList nodeList = doc.SelectNodes("//Country");
            foreach(XmlNode node in nodeList){
                if (node != null)
                {                        
                    int id = int.Parse(node.ChildNodes.Item(0).InnerText);
                    string name = node.ChildNodes.Item(1).InnerText;
                    City city = new City(id,name);
                    cityList.Add(city);
                }
            }