0

我是 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 的组节点(它没有t 满足条件)。

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

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

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

4

1 回答 1

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);
于 2012-06-12T23:18:32.327 回答