2009-12-30 29 views
3

试图使用LINQ XML将以下XML文件(可以更改为)读入到一个VAR中。带有XML的C#LINQ无法将多个具有相同名称的字段提取到对象中

<?xml version='1.0'?> 
<config> 
    <report> 
     <name>Adjustment Report</name> 
     <extension>pdf</extension> 
     <filetype>adobe_pdf</Filetype> 
     <field name="total" type="currency" /> 
     <field name="adjust" type="currency" /> 
     <field name="monthly" type="currency" /> 
     <output> 
      <format>Excel</format> 
      <AutoFormat>True</AutoFormat> 
     </output> 
     <reportstart>adjustment report</reportstart> 
     <reportend></reportend> 
     <linebegins> 
      <regex>(?&lt;ssn&gt;\d{3}-\d{2}-\d{4})</Regex> 
     </linebegins> 
     <regex>"(?&lt;last&gt;\s{0,1}[A-Z-'.]+\s{0,1}[A-Z-'.]+),(?&lt;first&gt;\s[A-Z-'.]+\s{0,1})(?&lt;middle&gt;[A-Z][.]|\s{0,1})"></Regex> 
     <regex>"(?&lt;ssn&gt;\d{3}-\d{2}-\d{4})"</Regex> 
     <regex>"(?&lt;total&gt;\$[,/d]+)(?&lt;adjust&gt;\$[,/d]+)(?&lt;monthly&gt;\$[,/d]+)"</Regex> 
    </report> 
</config> 

什么是行不通的是读取多个元素到对象中。我只能读第一个。显然,持有该字段的对象需要是一个数组?这是迄今为止的代码。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ElementDemo 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

    XElement xml = XElement.Load("C:\\TEMP\\test.xml"); 

    var reports = from report in xml.Descendants("report") 
    where report.Element("name").Value.Contains("Adjustment Report") 
    select new 
    { 
    Name = report.Element("name").Value, 
    Extension = report.Element("extension").Value, 
    FileType = report.Element("filetype").Value, 
    // Fields : How is this done? 
    }; 

    foreach(var obj in reports) 
    { 
    Console.WriteLine("Name: " + obj.Name); 
    }; 
    Console.ReadLine(); 
    } 
} 
} 

在此先感谢。

回答

8

使用Elements方法获取所有field元素,然后调用Select将它们转换为对象。

例如:

var reports = from report in xml.Descendants("report") 
    where report.Element("name").Value.Contains("Adjustment Report") 
    select new { 
     Name = report.Element("name").Value, 
     Extension = report.Element("extension").Value, 
     FileType = report.Element("filetype").Value, 
     Fields = report.Elements("field") 
      .Select(f => new { 
       Name = f.Attribute("name").Value, 
       Type = f.Attribute("type").Value 
      }).ToArray() 
    }; 
相关问题