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 に答える