2010-07-21 99 views
3

我有一个看起来像这样的xml文件;使用LINQ创建对象

<Employee> 
    <EmployeeName>Burt Reynolds</EmployeeName> 
    <EmployeeTitle>Bad Ass</EmployeeTitle> 
    <EmployeeStory> 
     <EmployeeStoryHeaderParagraph> 
      <EmployeeHeader>Employee Header 1</EmployeeHeader> 
      <EmployeeParagraphs> 
       <EmployeeParagraph>Employee Paragraph 1.1</EmployeeParagraph> 
      </EmployeeParagraphs> 
      <EmployeeParagraphs> 
       <EmployeeParagraph>Employee Paragraph 1.2</EmployeeParagraph> 
      </EmployeeParagraphs> 
     </EmployeeStoryHeaderParagraph> 
     <EmployeeStoryHeaderParagraph> 
      <EmployeeHeader>Employee Header 2</EmployeeHeader> 
      <EmployeeParagraphs> 
       <EmployeeParagraph>Employee Paragraph 2.1</EmployeeParagraph> 
      </EmployeeParagraphs> 
      <EmployeeParagraphs> 
       <EmployeeParagraph>Employee Paragraph 2.2</EmployeeParagraph> 
      </EmployeeParagraphs> 
     </EmployeeStoryHeaderParagraph> 
    </EmployeeStory> 
    <EmployeeImage> 
     <include type="Image" resolve="false" sourcedFrom="local" externalPath="/PublishingImages/2nav_bg.png" height="29" width="2" query="">/PublishingImages/2nav_bg.png</include> 
    </EmployeeImage> 
    <EmployeeSigImage> 
     <include type="Image" resolve="false" sourcedFrom="local" externalPath="/PublishingImages/down_carat.gif" height="7" width="12" query="">/PublishingImages/down_carat.gif</include> 
    </EmployeeSigImage> 
    <EmployeeVideo>http://sandbox/RichMedia/Robotica_720.wmv</EmployeeVideo> 
    </Employee> 

雇员标签将1到n。 EmployeeStoryHeaderParagraph标签会1到n。 EmployeeParagraphs标签从1到n。

我想创建一个对象,并将其添加到列表使用此数据,但我坚持抓住标题和段落。目前代码看起来像这样。

XDocument employeeXML = XDocument.Parse(e.Result); 

employeeList = (from employee in employeeXML.Descendants(ns + "Employee") 
       select new Employee(employee.Element(ns + "EmployeeName").Value, 
            employee.Element(ns + "EmployeeTitle").Value, 
            employee.Element(ns + "EmployeeImage").Element(ns + "include").Attribute("externalPath").Value, 
            employee.Element(ns + "EmployeeSigImage").Element(ns + "include").Attribute("externalPath").Value, 
            employee.Element(ns + "EmployeeVideo").Value, 
            headers, 
            content 
       )).ToList(); 

员工是我创建的一个类,它将此作为一个构造函数;

public Employee(string _employeeName, string _employeeTitle, string _employeeImage, string _employeeSigImage, string _employeeMovieUri, List<string> _employeeHeader, List<string[]> _employeeContent) 

当我在我的LINQ语句头以上,我需要它去通过,并从当前的员工是在创建标头列表时,得到内容,我需要字符串数组包含列表与该标题关联的EmployeeParagraphs。因此,header [1]将是content [1]字符串的标题。我不知道如何在Linq中做到这一点,我可以将代码添加到上面显示的标题和内容中以创建新列表,还是在我进入此列表之前执行此操作?

也许有一种比我目前正在尝试的更好的方法吗?

回答

1

选择是你的朋友和列表<>()有一个构造函数一个IEnumerable,你可以利用。

XDocument employeeXML = XDocument.Parse(e.Result); 

      employeeList = (from employee in employeeXML.Descendants(ns + "Employee") 
          select new Employee(employee.Element(ns + "EmployeeName").Value, 
               employee.Element(ns + "EmployeeTitle").Value, 
               employee.Element(ns + "EmployeeImage").Element(ns + "include").Attribute("externalPath").Value, 
               employee.Element(ns + "EmployeeSigImage").Element(ns + "include").Attribute("externalPath").Value, 
               employee.Element(ns + "EmployeeVideo").Value, 
               New List<string>(employee.Descendants("EmployeeStoryHeaderParagraph").Select(e => e.Element("EmployeeHeader").Value)), 
               New List<string[]>(employee.Descendants("EmployeeStoryHeaderParagraph").Select(e => e.Descendants("EmployeeParagraphs").Select(ep => ep.Element("EmployeeParagraph").Value).ToArray())) 
          )).ToList(); 

尽管如此,如果您使用Employee的构造函数,也许可以优化它。允许构造函数为头文件和内容传递一个IEnumerable,然后在类本身中进行解析。这样,你可以“简化”的LINQ到:

  employeeList = (from employee in employeeXML.Descendants(ns + "Employee") 
          select new Employee(employee.Element(ns + "EmployeeName").Value, 
               employee.Element(ns + "EmployeeTitle").Value, 
               employee.Element(ns + "EmployeeImage").Element(ns + "include").Attribute("externalPath").Value, 
               employee.Element(ns + "EmployeeSigImage").Element(ns + "include").Attribute("externalPath").Value, 
               employee.Element(ns + "EmployeeVideo").Value, 
               employee.Descendants("EmployeeStoryHeaderParagraph") 
          )).ToList(); 
+0

正是我需要感谢束。 – theDawckta 2010-07-21 21:10:18

+0

当然可以。很高兴帮助。 – 2010-07-21 22:01:07