2011-10-18 17 views
1

linqからxmlを使用して構造体リストを作成しています。LinqからXMLへの結果が得られません

linqパスで概念要素が見つかりません。私はこれを様々な形式で試してみました。そして、私があきらめてxpathを使う前に、誰かが私にlinqの方法を見せてくれることを願っています。おかげ

は、ここでのxml

<response xmlns="http://www.domain.com/api"> 
    <about> 
    <requestId>E9B73CA1F16A670C966BE2BABD3B2B22</requestId> 
    <docId>09E167D994E00B0F511781C40B85AEC3</docId> 
    <systemType>concept</systemType> 
    <configId>odp_2007_l1_1.7k</configId> 
    <contentType>text/plain</contentType> 
    <contentDigest>09E167D994E00B0F511781C40B85AEC3</contentDigest> 
    <requestDate>2011-10-18T09:51:28+00:00</requestDate> 
    <systemVersion>2.1</systemVersion> 
    </about> 
    <conceptExtractor> 
    <conceptExtractorResponse> 
     <concepts> 
     <concept weight="0.010466908" label="hell"/> 
     </concepts> 
    </conceptExtractorResponse> 
    </conceptExtractor> 
</response> 

は、ここで私はあなたがルート要素にデフォルト設定された名前空間を、忘れてしまった

public struct conceptweight 
{ 
    public string concept { get; set; } 
    public string weight { get; set; } 
} 

List<conceptweight> list = (from c 
    in d.Descendants("response") 
     .Descendants("conceptExtractor") 
     .Descendants("conceptExtractorResponse") 
     .Descendants("concepts") 
    select new conceptweight() 
     { 
      concept = c.Attribute("label").Value, 
      weight = c.Attribute("weight").Value 
     }).ToList(); 
+0

どのように 'd'を読み込みましたか? –

答えて

1

を持っているものです。これを試してみてください:

// Note: names changed to follow conventions, and now a class 
// rather than a struct. Mutable structs are evil. 
public class ConceptWeight 
{ 
    public string Concept { get; set; } 
    // Type changed to reflect the natural data type 
    public double Weight { get; set; } 
} 

XNamespace ns = "http://www.domain.com/api"; 

// No need to traverse the path all the way, unless there are other "concepts" 
// elements you want to ignore. Note the use of ns here. 
var list = d.Descendants(ns + "concepts") 
      .Select(c => new ConceptWeight 
        { 
         Concept = (string) c.Attribute("label"), 
         Weight = (double) c.Attribute("weight"), 
        }) 
      .ToList(); 

それは任意の値を加算していなかったように私はここにクエリ式を使用していない - あなただけfrom x in y select zをしていた、より簡単にSelect拡張メソッドを介して発現されています。

+0

ああありがとう。 xmlnodesをループすることによって構造体を構築することは今やうまく機能しています。 – Jules

0
XNamespace n = "http://www.domain.com/api"; 
List<conceptweight> list = (from c in d.Elements(n + "response").Elements(n + "conceptExtractor").Elements(n + "conceptExtractorResponse").Elements(n + "concepts").Elements(n + "concept") 
          select new conceptweight 
          { 
           concept = c.Attribute("label").Value, 
           weight = c.Attribute("weight").Value 
          }).ToList(); 

名前空間と最後の要素(concept)を忘れました。ああ、インライン初期化を行う場合には、の括弧はnew conceptweightには必要ありません。 AhとDescendantsは要素のすべての "レベル"をトラバースします。それを「手動で」トラバースする場合は、Elementsを使用します。

関連する問題