如何使用LINQ获取XML中的子元素值

时间:2014-12-12 05:22:05

标签: c# xml linq linq-to-xml

我正在尝试访问xml中的子元素值。

<Menus>
    <ParentMenu>
        <ParentName>Home</ParentName>
    </ParentMenu>
    <ParentMenu>
        <ParentName>Shop</ParentName>
        <SubMenus>
            <Submenu>
                <SubName>SHop1</SubName>
            </Submenu>
            <Submenu>
                <SubName>SHop2</SubName>
            </Submenu>
            <Submenu>
                <SubName>SHop3</SubName>
            </Submenu>
            <Submenu>
                <SubName>SHop4</SubName>
            </Submenu>
        </SubMenus>
    </ParentMenu>
    <ParentMenu>
        <ParentName>MegaMenu</ParentName>
    </ParentMenu>
</Menus>

有我的代码

var menus = (from Parent in xdoc.Root.Descendants("ParentMenu")
             select new Menus
             {
                 ParentName = Parent.Descendants("ParentName").First().Value,
                 Submenus = (from sub in Parent.Descendants("SubMenus")
                                               .Descendants("Submenu")
                             select new SubMenus 
                             {
                                 SubName = sub.Descendants("SubName")
                                              .First().Value,
                             }).ToList()
             }).ToList();

1 个答案:

答案 0 :(得分:1)

鉴于您似乎只是将整个Xml结构反序列化为a,我相信Xml反序列化是您尝试的更好的策略:

鉴于以下DTO结构(还注意到ParentMenu项没有包装器):

public class Submenu
{
    public string SubName { get; set; }
}
public class ParentMenu
{
    public string ParentName { get; set; }
    public List<Submenu> SubMenus { get; set; }
}
public class Menus
{
    [XmlElement("ParentMenu")]
    public List<ParentMenu> ParentMenus { get; set; }
}

然后您可以简单地反序列化:

var ser = new XmlSerializer(typeof(Menus));
using (var sr = new StringReader(xml)) // Or use TextReader if you are off file
{
    var result = (Menus)ser.Deserialize(sr);
}

但是,如果你真的想在Linq到Xml中手动进行上述反序列化,那么这将适用于上面相同的DTO结构:

var menus = (from Parent in xdoc.Root.Descendants("ParentMenu")
             select new ParentMenu
             {
                 ParentName = Parent.Descendants("ParentName").First().Value,
                 SubMenus = (from sub in Parent.Descendants("SubMenus")
                                               .Descendants("Submenu")
                             select new Submenu
                             {
                                 SubName = sub.Descendants("SubName")
                                              .First().Value,
                             }).ToList()
             }).ToList();