2016-03-19 8 views
1

私はフィールド名ユーザー名を選択しようとすると、別のプロパティで同じレベルから、私はLINQクエリ同じレベルのxmlタグから属性をlinqで選択するにはどうすればよいですか?以下のXMLで

に間違ってやっているかわからないんだけど、「バリュー」

を取得しています

<?xml version="1.0"?> 
<Objects> 
    <Object> 
    <Property Name="Value" Type="System.String">DeathStar</Property> 
    <Property Name="FieldName" Type="System.String">Server</Property> 
    </Object> 
    <Object> 
    <Property Name="Value" Type="System.String">Luke</Property> 
    <Property Name="FieldName" Type="System.String">Username</Property>  
    </Object> 
</Objects> 

     var usernameValue = 
      from v in 
       from e in xd.Descendants().Elements() 
       let p = e.Parent 
       where 
        e.HasAttributes 
        && e.Name.LocalName.Equals("Property") 
        && e.Attribute("Name").Value.Equals("FieldName") 
        && e.Value.Equals("UserName") 
       select p 
      where 
       v.HasAttributes 
       && v.Name.LocalName.Equals("Property") 
       && v.Attribute("Name").Value.Equals("Value") 
      select v.Value; 

答えて

0

私はあなたがFieldNameをチェックし、対応するValueを返すことができ、そこからObject要素に対してクエリをベースにすることをお勧めしたい。また、そのXMLを気づく

var usernameValue = 
     from o in xd.Descendants("Object") 
     where 
      o.Elements("Property") 
      .Where(p => (string)p.Attribute("Name") == "FieldName" && (string)p == "Username") 
      .Any() 
     select 
      o.Elements("Property") 
      .Where(p => (string)p.Attribute("Name") == "Value") 
      .Select(p => (string)p) 
      .FirstOrDefault(); 

大文字と小文字が区別されるため、UsernameはXMLの場合と同様に、LINQと同様にUserNameと一致しません。

0

これは機能します。コレクションを2回、最初にオブジェクトレベルで、次にプロパティ値でフィルタリングする必要があります。

var resultnode = doc.Descendants("Object") 
    .Where(d=> d.Descendants("Property").Any(c=>c.Attribute("Name").Value == "FieldName") && d.Descendants("Property").Any(c=>c.Value == "Username")) 
    .Descendants("Property") 
    .Where(p=>p.Attribute("Name").Value == "Value") 
    .FirstOrDefault();  

Now値は、を使用してアクセスできます。

if(resultnode != null) 
{ 
    resultnode.Value; // value 
} 

の作業Code

+0

おかげで私はこのReSharperのがFirstOrDefaultへの単一の呼び出しに置き換え文句を言ったと一緒に行くことになったので、私はWhere句を削除し、.FirstOrDefaultにどこラムダを移動しました。なぜresharperが不平を言うのか分からないので、もっときれいに見えると思う。 – coredumpman

+0

問題はありませんが、私はそれが最高の解決策を見つけるのを助けてくれたことを嬉しく思っています。見つけた解決策を書いて、この質問に答えてマークを付けることをお勧めします。それは他の人に役立つかもしれません。 –

関連する問題