2017-04-03 4 views
0

いくつかの素晴らしい回答のおかげで、LINQ to XMLを使用してXMLファイルの要素を見つける方法を理解しました。兄弟の値がわかっている場合の属性の値を確認

私は次のように苦しんでいます:私は唯一の兄弟値を知っているから、属性の値を見つけるために:私は場所のIDを知っていればどのように私は本の量を見つけるだろう

<books> 
    <book> 
     <author>Douglas Adams</author> 
     <title>The Hitch Hikers Guide to the Galaxy</title> 
     <price>42</price> 
     <locationId>1</locationId> 
     <quantity>0</quantity> 
    </book> 
    <book> 
     <author>Douglas Adams</author> 
     <title>The Hitch Hikers Guide to the Galaxy</title> 
     <price>42</price> 
     <locationId>2</locationId> 
     <quantity>7</quantity> 
    </book> 
    <book> 
     <author>Douglas Adams</author> 
     <title>The Hitch Hikers Guide to the Galaxy</title> 
     <price>42</price> 
     <locationId>3</locationId> 
     <quantity>20</quantity> 
    </book> 
    <book> 
     <author>Douglas Adams</author> 
     <title>The Hitch Hikers Guide to the Galaxy</title> 
     <price>42</price> 
     <locationId>4</locationId> 
     <quantity>5</quantity> 
    </book> 
</books> 

のみ? quantitylocationId = 3としたいとします。

私のアプローチは、ループを作成し、目的の位置IDを見つけるとすぐに停止することです。これは最善のアプローチのように聞こえますか? LINQ to XMLを使用してこれを実現する簡単な方法はありますか?

答えて

2

Descendantsメソッドを使用してすべての書籍を取得し、Where拡張メソッドを使用してフィルタを適用し、Select extでプロジェクトでき​​ます。方法quantity

XDocument xdoc = XDocument.Load(path); 
var result=xdoc.Descendants("book") 
       .Where(e=>(int)e.Element("locationId")==3) 
       .Select(e=>(int)e.Element("quantity")) 
       .FirstOrDefault(); 
+1

コードは誤植、 'doc'を持っていると' xdoc'変数は、感謝@MrinalKamboj –

+0

が固定同じではありません。それは終了タグに関する誤植でした。今すぐ修正します。 – octavioccl

1

まず、あなたはの終了タグに問題があるlocationId

LINQのツーXMLはタグのorederが常に同じである場合に使用できるので、NodesAfterSelf方法を持っています:

var quantityElement = xdoc.Descendants("locationId") 
      .First(l=>l.Value=="3") 
      .NodesAfterSelf() 
      .FirstOrDefault(); 

編集 - 実際に上記

見つかりませ場所はありません場合は例外をスローすることができます。以下はそうしないでしょう。

var quantityElement = xdoc 
      .Descendants("locationId") 
      .Where(l=>l.Value=="3") 
      .SelectMany(l=>l.NodesAfterSelf()) 
      .FirstOrDefault(); 
+0

おかげ@Ofir – jrn

1

この機能が必要なVBの場合。次の解決策では、タグの順序についての前提はありません。

Dim xe As XElement 
    'for testing 
    xe = <books> 
      <book> 
       <author>Douglas Adams</author> 
       <title>The Hitch Hikers Guide to the Galaxy</title> 
       <price>42</price> 
       <locationId>1</locationId> 
       <quantity>0</quantity> 
      </book> 
      <book> 
       <author>Douglas Adams</author> 
       <title>The Hitch Hikers Guide to the Galaxy</title> 
       <price>42</price> 
       <locationId>2</locationId> 
       <quantity>7</quantity> 
      </book> 
      <book> 
       <author>Douglas Adams</author> 
       <title>The Hitch Hikers Guide to the Galaxy</title> 
       <price>42</price> 
       <locationId>3</locationId> 
       <quantity>20</quantity> 
      </book> 
      <book> 
       <author>Douglas Adams</author> 
       <title>The Hitch Hikers Guide to the Galaxy</title> 
       <price>42</price> 
       <locationId>4</locationId> 
       <quantity>5</quantity> 
      </book> 
     </books> 

    'the answer - by selecting the <book> all nodes are available. 
    Dim aBook As XElement = xe...<book>.SingleOrDefault(Function(el) el.<locationId>.Value = "3") 

    'verification 
    If aBook IsNot Nothing Then 
     Debug.WriteLine(aBook.<quantity>.Value) 
     Debug.WriteLine(aBook.<author>.Value) 
     Debug.WriteLine(aBook.<title>.Value) 
    End If 
関連する問題