2012-04-09 43 views
2

我在看(如下所示)的XML文件:的LINQ to XML不知道有多少后裔有

<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> 

目前,我有以下代码:

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() 
       })); 
     } 

这里的问题是对于<data>我不知道有多少后裔将在那里或他们将被称为什么。有没有办法在不知道这些信息的情况下分开分析这些信息?现在,我会得到类似1234656865的东西,实际上我想在一个对象中使用1234,在同一个对象中使用656865。

回答

1

改变内心的“数据”,选择到:

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

这会给string列表有两个元素:1234和656865.您可以轻松地使用String.Join()方法它加入到一个字符串:

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

当我这样做的时候,我在ToList()的最后得到一个错误。它试图将一个generic.list转换为我的业务对象。现在业务对象只是公共字符串event_data {get;组; },这是怎么工作的? – mameesh 2012-04-09 15:34:00

+0

我编辑了我的答案。 'event_data'应该是'List '或'IEnumerable '。如果你只需要一个空格作为分隔符的字符串,可以使用第二个例子,用'String.Join()' – MarcinJuraszek 2012-04-09 15:36:15

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; } 
}