2017-10-23 5 views
0

要素を選択しようとしているXML文字列があり、XDocument.Decendents()メソッドについて混乱しています。ここにサンプルXMLがあります。XDocument.Descendants()フィルタが多すぎます

<response> 
    <control> 
    <status>success</status> 
    <dtdversion>3.0</dtdversion> 
    </control> 
    <operation> 
    <authentication> 
     <status>success</status> 
     <userid>jsmith</userid> 
     <companyid>1621876182</companyid> 
     <sessiontimestamp>2017-10-23T11:57:27-07:00</sessiontimestamp> 
    </authentication> 
    <result> 
     <status>success</status> 
     <function>GetFields</function> 
     <controlid>723973</controlid> 
     <data listtype="All" count="1"> 
     <type fieldname="ID">User Id</type> 
     <type fieldname="FIRSTNAME">User First Name</type> 
     <type fieldname="LASTNAME">User Last Name</type> 
     <type fieldname="MIDDLEINITIAL">User Middle Initial</type> 
     <type fieldname="ADDRESS1">User Address 1</type> 
     <type fieldname="ADDRESS2">User Address 1</type> 
     <type fieldname="CITY">City of User Residence</type> 
     <type fieldname="STATE">State of User Residence</type> 
     <type fieldname="PHONENUMBER">User Phone Number</type> 
     <type fieldname="EMAIL">User Email Address</type> 
     </data> 
    </result> 
    </operation> 
</response> 

私の目標は、dataノード内のノード値のリストを取得することです。私は次のことが働き、10要素のリストを返すことがわかります。私を混乱させる何

List<string> nodeList = xml.Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>(); 

は私が子ノードのための下になります唯一のノードとしてdataノードを指定しようとしたことです。私はちょうど"データ"Descendants()メソッドのXNameパラメータとして追加しました。

List<string> nodeList = xml.Descendants("data").Attributes("fieldname").Select(x => x.Value).ToList<string>(); 

この場合、結果はゼロのnodeList数を返しました。 「fieldname」の属性名を持つXML文書内の他のノードが<data>ノードの子要素以外のものが選択されないように、どのノードを選択すべきかをより具体的に探求していました。私はなぜ結果がゼロになったのかわからないし、誰かがこれについていくつかの光を当てることを望んでいた。

+0

いくつのエントリがありますか? – Nikolaus

+0

私は10ノードを返すことを期待しています – webworm

答えて

1

私は、子孫は型データである子孫をフィルタリングしますが、属性を持つデータ子孫は存在しないと思います。 試用回数:

List<string> nodeList = xml.Descendants("data").Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>(); 
+0

それはそれをしました!説明ありがとう。だから、 'Descendants(" data ")'は 'data'の値を持つルートノードの子孫を選択するだけです。子ノードを選択するには、2番目の 'Descendants()'が必要です。 – webworm

関連する問題