如何在一个linq语句中解析这个XML ?

本文关键字:XML 语句 一个 linq | 更新日期: 2023-09-27 18:01:25

<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;

如何在一个linq语句中解析这个XML ?

您可以在展开查询结果时导航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()而不仅仅是select new——这将创建一个Megafruit类的新实例,并根据XML设置属性。

请注意,这是一个非常简单的示例,假设每个水果都出现一次—这与我在许多月前的工作中所做的类似,我知道我要获得的数据不会是一个集合(如梨,橘子或其他任何东西的集合),因此我可以使用SingleOrDefault。