根据条件LINQ TO XML C#选择元素

msb*_*uva 0 c# linq-to-xml

我使用LINQ TO XML查询XML.我想基于一些条件检查查询记录这里是我的XML下面:XML将有多个订单,每个订单将在我想要选择的顺序,其中param节点属性存储值不为null,如果存在应该是1并且还订购纸箱信息......

    <orders>
        <order>
            <criteria>
                <param name="location">123</param>
                <param name="name">Chicago</param>
                <param name="Store">1</param>
                <param name="Account Number">1212121212</param>
            </criteria>
            <items>
                <item> </item>
                <item> </item>           
            </items>
            <cartons>
                <carton>
                     <size> </size>
                     <weight></weight>
                </carton>
            </cartons>
        </order>
    <Order>
    </Order>
    </orders>
Run Code Online (Sandbox Code Playgroud)

我能做到这一点:

var result = from item in doc.Descendants("order")
                where item.Element("criteria").Element("param").Attribute("name").Value.Contains("store") == true
                && item.Element("cartons") != null
                select item;"
Run Code Online (Sandbox Code Playgroud)

如果我的store(param)属性在过滤器节点中是第一个但是如果我将商店(param)移动到其他位置而不是首先它不过滤它,则上面工作正常

Jon*_*eet 5

问题是你只看一个 param元素 - 总是第一个元素,因为这就是它的Element作用.

如果任何参数是值为1的"Store"元素,您希望匹配,因此您希望使用该Any方法并使用它Elements来查找所有参数:

var query = from item in doc.Descendants("order")
            where item.Element("criteria").Elements("param")
                      .Any(p => p.Attribute("name").Value == "Store" &&
                                (int) p == 1)
                  && item.Element("cartons") != null
            select item;
Run Code Online (Sandbox Code Playgroud)

查询表达式并没有真正帮助你 - 我使用:

var query = doc.Descendants("order")
               .Where(item => item.Element("criteria").Elements("param")
                                  .Any(p => p.Attribute("name").Value == "Store" &&
                                            (int) p == 1)
                              && item.Element("cartons") != null);
Run Code Online (Sandbox Code Playgroud)