2010-07-21 98 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