我如何在一个linq语句中解析此xml

时间:2011-07-07 20:16:33

标签: c# xml linq parsing

<Fruit>
    <Apple>
        <Pear>dar</Pear>
        <Orange/>
        <Starfruit>har</Starfruit>
    </Apple>
    <Lemon>
        <Melon>yar</Melon>
        <Lime>blah</Lime>
    </Lemon>
<Fruit>

目前我有两个select语句,然后将这两个单独的枚举中的值存储到一个对象中。

        var myfruits = from myfruit in document.Descendants("UserAccount")
                   select new
                   {
                       Pear= myfruit.Element("Pear").Value,
                       Starfruit= myfruit.Element("Starfruit").Value,

                   };
        var myfruits2 = from myfruit2 in document.Descendants("Product")
                    select new
                    {
                        Melon= myfruit2.Element("Melon").Value,
                        Lime= myfruit2.Element("Lime").Value,
                    };
        foreach (var myfruit in myfruits)
        {
            megafruit.Pear=myfruit.Pear;
            megafruit.Starfruit=myfruit.Starfruit;
        }
        foreach (var myfruit2 in myfruits2)
        {
            megafruit.Melon= myfruit2.Melon;
            megafruit.Lime= myfruit2.Lime;
        }
        return megafruit;

1 个答案:

答案 0 :(得分:0)

您可以在展开查询结果时导航XML文档(因为您拥有所有后代节点的集合)。像这样:

XDocument document = XDocument.Parse("<Fruit><Apple><Pear>dar</Pear><Orange/><Starfruit>har</Starfruit></Apple><Lemon><Melon>yar</Melon><Lime>blah</Lime></Lemon></Fruit>");

var megafruit = (from x in document.Descendants("Fruit")
                 select new
                 {
                     Pear = x.Element("Apple").Element("Pear").Value,
                     Orange = x.Element("Apple").Element("Orange").Value,
                     Starfruit = x.Element("Apple").Element("Starfruit").Value,
                     Melon = x.Element("Lemon").Element("Melon").Value,
                     Lime = x.Element("Lemon").Element("Lime").Value
                 }).SingleOrDefault();

这将生成一个匿名类,其属性已填充所提供的XML的值。或者,您也可以使用select new Megafruit()而不是仅选择new - 这将创建Megafruit类的新实例,其属性根据XML设置。

请注意,这是一个非常简单的例子,假设每个果实出现一次 - 它类似于我多年前在工作中所做的事情,我知道我得到的数据不会是一个集合(如梨,或橙子等等的集合,所以我可以使用SingleOrDefault。