2011-04-28 112 views
0

我之前在其他文章中發佈了另一篇文章,介紹如何使用XSLT轉換XmlDocument,但也許可以使用LINQ來完成。幫助LINQ to Xml

我有一個看起來像一個XmlDocument:

<DocumentElement> 
    <Customer> 
    <CustomerId>2315</CustomerId> 
    <VersionNumber>1</VersionNumber> 
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID> 
    </Customer> 
    <Customer> 
    <CustomerId>2316</CustomerId> 
    <VersionNumber>2</VersionNumber> 
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID> 
    </Customer> 
    <Customer> 
    <CustomerId>2317</CustomerId> 
    <VersionNumber>1</VersionNumber> 
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID> 
    </Customer> 
</DocumentElement> 

我可以,使用LINQ,提取一個客戶元素爲每一個獨特的GUID,並獲得最高版本號的客戶?

I.e.新的/已轉換的文檔將如下所示:

<DocumentElement> 
    <Customer> 
    <CustomerId>2316</CustomerId> 
    <VersionNumber>2</VersionNumber> 
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID> 
    </Customer> 
    <Customer> 
    <CustomerId>2317</CustomerId> 
    <VersionNumber>1</VersionNumber> 
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID> 
    </Customer> 
</DocumentElement> 

在此先感謝。

更新:

所以我應該做的(如果我理解正確嗎?):

XDocument xdoc = new XDocument(); 
    using (StringWriter sw = new StringWriter()) 
    { 
     // Converts the datatable to XML        
     dt.WriteXml(sw); 
     xdoc = XDocument.Parse(sw.ToString()); 
    } 

     var query = xdoc.Root 
      .Elements("Customer") 
      .GroupBy(x => x.Element("GUID").Value) 
      .Select(g => g.OrderByNumberDescending(x =>(int)x.Element("VersionNumber")) 
          .First()); 

我仍然得到的GroupBy錯誤,雖然,還是我錯了別人在這裏做什麼?

+0

使用'XDocument.Parse',而不是'LoadXml' - 甚至只是'XElement.Parse'。如果你採用後一種路線,那麼元素本身可以用作「父母」;否則你需要'doc.Root'作爲'parent'。 – 2011-04-28 07:13:27

+0

確切的錯誤是什麼?你在使用僞指令列表中使用System.Linq嗎? – 2011-04-28 09:00:22

+0

對不起,我在第二次更新時刪除了錯誤信息。無論如何,錯誤是我錯誤地使用system.xml.linq(所以一些linq的東西工作,有些沒有),而不是system.linq。 – Peter 2011-04-28 09:18:52

回答

5

絕對:

var query = parent 
    .Elements("Customer") 
    .GroupBy(x => x.Element("GUID").Value) 
    .Select(g => g.OrderByNumberDescending(x => (int) x.Element("VersionNumber")) 
        .First()); 

或者使用MoreLINQ

var query = parent 
    .Elements("Customer") 
    .GroupBy(x => x.Element("GUID").Value) 
    .Select(g => g.MaxBy(x => (int) x.Element("VersionNumber"))); 
+0

嗨喬恩,我更新了我的問題 – Peter 2011-04-28 07:05:46

+0

謝謝,我再次更新我的文章 – Peter 2011-04-28 08:59:23