【问题标题】:Select elements based on condition LINQ TO XML C#根据条件选择元素 LINQ TO XML C#
【发布时间】:2014-11-20 04:23:33
【问题描述】:

我正在使用 LINQ TO XML 查询 XML。我想根据一些条件检查来查询记录,下面是我的 XML: XML 将有多个订单,每个订单将在我想选择具有参数节点属性存储值不为空的订单,如果存在应该是 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>

我能做到这一点:

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

如果我的 store (param) 属性位于过滤器节点的第一个位置,则上述操作正常,但如果我将 store(param) 移动到第一个位置以外的其他位置,它不会过滤它

【问题讨论】:

  • 好的,这一切听起来都很合理——到目前为止你尝试过什么?你看过XElement.Attribute方法和XElement.Element吗?例如...Where(x =&gt; x.Element("criteria").Elements("param").Any(p =&gt; (string) p.Attribute("name") == "Store" &amp;&amp; (int) p.Value == 1))
  • 好的,我有这个“ 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;"
  • 请把它放到问题中,并解释它目前所做的和你想要它做什么之间的区别。
  • 我确实将其添加到我的问题@JonSkeet

标签: c# linq-to-xml


【解决方案1】:

问题在于您只查看 一个 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;

查询表达式在这里并没有真正帮助您 - 我会使用:

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

【讨论】:

  • 这是一个直截了当的答案。我认为使用你的 sn-p 代码他不会出错!
  • @Jon Skeet 感谢您的回答...任何功能都可以解决问题..再次感谢..!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多