【问题标题】:Filter xml with LINQ2XML使用 LINQ2XML 过滤 xml
【发布时间】:2012-06-13 21:16:23
【问题描述】:

我是 LINQ2XML 的新手。我正在尝试过滤一个 xml 文件并获取另一个带有结果的 xml。我想按某些属性的值进行过滤。

xml看起来是这样的(缩略版,实际版本有更多的节点和属性):

<Root>
    <Group Price="50">
       <Item Price="60"/>
       <Item Price="50"/>
       <Item Price="70"/>
    </Group>
    <Group Price="55">
       <Item Price="62"/>
       <Item Price="57"/>
       <Item Price="55"/>
    </Group>
    <Group Price="61">
       <Item Price="62"/>
       <Item Price="61"/>
       <Item Price="65"/>
    </Group>
    <!--More Group Nodes--> 
</Root>

现在假设我想要价格低于 60 的节点。我想要得到的是: 我删除了价格为 60、70 和 62 的节点。编辑:我想删除价格为 61 的组节点(它不满足条件)。

<Root>
    <Group Price="50">
       <Item Price="50"/>
    </Group>
    <Group Price="55">
       <Item Price="57"/>
       <Item Price="55"/>
    </Group>
    <!--More Group Nodes--> 
</Root>

或者也许有什么方法可以删除不满足条件的节点?感谢您的回答。

PS:我想知道这是否也可以使用 XPATH 来完成。我将其发布在另一个问题中:

【问题讨论】:

    标签: .net linq


    【解决方案1】:

    搜索要移除的节点,然后移除它们。

    var filterPrice = 60M;
    var removeMe =
        from item in doc.Descendants("Item")
        where (decimal)item.Attribute("Price") >= filterPrice
        select item;
    removeMe.Remove();
    

    或者使用 XPath:

    var filterPrice = 60M;
    var xpath = String.Format("//Item[@Price>={0}]", filterPrice);
    var removeMe = doc.XPathSelectElements(xpath);
    removeMe.Remove();
    

    组合也可以删除组:

    var filterItemPrice = 60M;
    var filterGroupPrice = 60M;
    var removeGroups =
        from grp in doc.Descendants("Group")
        where (decimal)grp.Attribute("Price") >= filterGroupPrice
        select grp;
    var removeItems =
        from item in doc.Descendants("Item")
        where (decimal)item.Attribute("Price") >= filterItemPrice
        select item;
    var removeMe = removeItems.Concat(removeGroups);
    

    【讨论】:

    • 感谢您的回复。我测试了它并且它有效。如果我想删除不满足条件的组节点,可以只用一句话完成,还是必须分两步完成(首先删除组节点,然后删除项目节点)?
    • 当然可以将它们组合成一个语句。幸运的是,两者都包含要测试的同名属性,因此您可以组合选择器。否则,您可以分别选择这两个集合并将它们连接在一起。
    • 谢谢杰夫。到目前为止,我分两步搞定了。现在我想通过属性价格获取 xml 排序器。订购组节点,然后订购项目节点。我在以下位置发布了另一个问题:stackoverflow.com/questions/11011941/…> 感谢您在 LINQ 和 XPath 的第一步中帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多