如何使用Linq从XML获得强类型集合

本文关键字:强类型 集合 XML 何使用 Linq | 更新日期: 2023-09-27 18:15:09

这是我的XML文件的一个片段(我意识到它的格式不理想,但不幸的是我不能改变它):

<PRODMENUS>
<MENU id="90168" shortname="BrdSumPV13" mealname="Dinner" mealid="7" servedate="20130102">Summer PREV 2013</MENU>
<MENU id="90153" shortname="BrdSumPV13" mealname="Breakfast" mealid="46" servedate="20130102">Summer PREV 2013</MENU>
<MENU id="90162" shortname="BrdSumPV13" mealname="Lunch" mealid="6" servedate="20130102">Summer PREV 2013</MENU>
</PRODMENUS>
下面的函数可以工作,但是它只获取第一个菜单元素,而不能获取其余的
public static List<Menu> GetLocations(string uri)
{
    XDocument xmlDoc = XDocument.Load(uri);
    var menus = from menu in xmlDoc.Elements("PRODMENUS")
                          select new Menu
                          {
                              Id = Convert.ToInt32(menu.Element("MENU").Attribute("id").Value),
                              ShortName = menu.Element("MENU").Attribute("shortname").Value,
                              MealName = menu.Element("MENU").Attribute("mealname").Value,
                              MealId = Convert.ToInt32(menu.Element("MENU").Attribute("mealid").Value)
                          };
    return menus.ToList();
}

如何使用上面的XML文件获得3个菜单对象的集合?

如何使用Linq从XML获得强类型集合

你很接近了

XDocument xmlDoc = XDocument.Load(uri);
var menus = from menu in xmlDoc.Descendants("MENU")
            select new Menu
            {
                Id = Convert.ToInt32(menu.Attribute("id").Value),
                ShortName = menu.Attribute("shortname").Value,
                MealName = menu.Attribute("mealname").Value,
                MealId = Convert.ToInt32(menu.Attribute("mealid").Value)
            };
return menus.ToList();

您也可以使用一些快捷键,如Id = (int)menu.Attribute("id")代替Id = Convert.ToInt32(menu.Attribute("id").Value)

你想再深入一级,选择xmlDoc.Elements("PRODMENUS").Elements("MENU")

var menus = from menu in xmlDoc.Elements("PRODMENUS").Elements("MENU")
            select new Menu
            {
                Id = Convert.ToInt32(menu.Attribute("id").Value),
                ShortName = menu.Attribute("shortname").Value,
                MealName = menu.Attribute("mealname").Value,
                MealId = Convert.ToInt32(menu.Attribute("mealid").Value)
            };