2012-04-09 4 views
2

があるどのように多くの子孫を知らずにXMLに私は次のようなXMLファイルで探しています:LINQのは

IEnumerable<XElement> elements = documentXDoc.Descendants("test"); 

      _fuelReceipts.AddRange(elements 
       .Select(receipt => new Receipt() 
       { 
        vehicle_number = receipt.Element("vehiclenumber") == null ? "" : receipt.Element("vehiclenumber").Value, 
        field = receipt.Descendants("datafield") 
        .Select(x => new Field() 
        { 
         field_number = x.Element("fieldnumber") == null ? "" : x.Element("fieldnumber").Value, 
         event_data = x.Descendants("data") 
         .Select(y => new FieldData() 
         { 
          event_data = y.Value 
         }).ToList() 
        }).ToList() 
       })); 
     } 

ここでの問題は次のとおりです。現在、私は次のコードを持っている

<test> 
    <vehiclenumber>123</vehiclenumber> 
    <form> 
    <form_id>1</form_id> 
    <datafield> 
     <fieldnumber>1</fieldnumber> 
     <data> 
      <datawords> 
       <datatext1>1234</datatext1> 
       <mc2>656865</mc2> 
      </datawords> 
     </data> 
     </datafield> 
    </form> 
</test> 

<data>のために、そこに何人の子孫がいるのか、彼らが呼ばれるのか分かりません。この情報を知らなくてもこれらを別々に解析する方法はありますか?今は、私は実際にオブジェクトに1234を、同じオブジェクト内に別のオブジェクトに656865を入れたいときに、1234656865のようなものが得られるでしょう。

答えて

1
は、あなたの内なる「データ」に変更したものに選択

event_data = x.Descendants("data").Descendants().Where(d => !d.HasElements).Select(y => y.Value).ToList() 

これは、2つの要素を持つstringのリストが表示されます:1234と656865.あなたは簡単にString.Join()メソッドを使用して1つの文字列に、それに参加することができます。

event_data = String.Join(" ", x.Descendants("data").Descendants().Where(d => !d.HasElements).Select(y => y.Value).ToList()) 
+0

これを行うと、最後にToList()にエラーが発生します。それはgeneric.listを自分のビジネスオブジェクトに変換しようとしています。今すぐビジネスオブジェクトは単にパブリックですstring event_data {get;セット; }、これがうまくいくためにはどうでしょうか? – mameesh

+0

私は私の答えを編集しました。 'event_data'は' List 'または' IEnumerable 'でなければなりません。空白を区切り文字として使用する場合は、 'String.Join()'を使用して2番目の例を使用してください。 – MarcinJuraszek

1

私は、XML子孫の名前が意味があると仮定しています。このコードは、それらをFieldオブジェクトに抽出する際にそれらを辞書に入れます。

void Main() 
{ 
    string input = "<test><vehiclenumber>123</vehiclenumber><form><form_id>1</form_id><datafield>"; 
    input += "<fieldnumber>1</fieldnumber><data><datawords>"; 
    input += "<datatext1>1234</datatext1><mc2>656865</mc2>"; 
    input += "</datawords></data></datafield></form></test>"; 

    XDocument documentXDoc = XDocument.Parse(input); 
    IEnumerable<XElement> elements = documentXDoc.Descendants("test"); 

    IEnumerable<Receipt> _fuelReceipts = elements 
     .Select(receipt => new Receipt() 
     { 
      vehicle_number = receipt.Element("vehiclenumber") == null ? "" : receipt.Element("vehiclenumber").Value, 
      field = receipt.Descendants("datafield") 
      .Select(x => new Field() 
      { 
       field_number = x.Element("fieldnumber") == null ? "" : x.Element("fieldnumber").Value, 
       event_data = x.Elements("data").Descendants() 
        .Where(d => !d.HasElements) 
        .ToDictionary(d => d.Name.LocalName, d => d.Value) 
      }).ToList() 
     }); 
} 

class Receipt { 
    public string vehicle_number { get; set; } 
    public List<Field> field { get; set; } 
} 

class Field { 
    public string field_number { get; set; } 
    public Dictionary<string, string> event_data { get; set; } 
}