使用LINQ2XML过滤xml

时间:2012-06-12 23:12:47

标签: .net linq

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

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

<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完成此操作。我将其发布在另一个问题中:

1 个答案:

答案 0 :(得分: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);