2013-10-26 50 views
3

如何刪除XML文檔中屬性的重複值?使用LINQ刪除XML文檔中的重複值

這是一個示例XML有1複製的「名稱」值3 Ways - Fake Love

<?xml version="1.0" encoding="Windows-1252"?> 
<!--MasterMusik Song Database--> 
<Songs> 
    <Song><Name>3 Ways - Fake Love</Name><Year>2000-2006</Year><Genre>Dance</Genre><Bitrate>128</Bitrate><Length>03:50</Length><Size>3,51</Size></Song> 
    <Song><Name>3 Ways - Fake Love</Name><Year>2000-2006</Year><Genre>Dance</Genre><Bitrate>128</Bitrate><Length>03:50</Length><Size>3,51</Size></Song> 
    <Song><Name>A7 - Piece Of Heaven</Name><Year>2000-2006</Year><Genre>Dance</Genre><Bitrate>128</Bitrate><Length>03:27</Length><Size>3,17</Size></Song> 
</Songs> 

有了這個功能,我用自己的「名稱」值的XML元素進行排序,也是我嘗試使用刪除重複的名字Distinct方法,但什麼都不做。

Private Function Sort_XML_By_Element(ByVal XML As XDocument, _ 
           ByVal Root_Element As String, _ 
           ByVal Element_to_sort As String) As XDocument 

    Dim xdoc As XDocument 

    xdoc = XML 
    xdoc.Root.ReplaceNodes(XML.Root.Elements(Root_Element) _ 
           .OrderBy(Function(sort) sort.Element(Element_to_sort).Value).Distinct) 

    Return xdoc 

End Function 

回答

5

使用Remove擴展方法而不是Distinct。此方法將從文檔中刪除所有選定的節點。 C#代碼:

xdoc.Root.Elements("Song") 
    .GroupBy(s => (string)s.Element("Name")) 
    .SelectMany(g => g.Skip(1)) // select all nodes from group except first one 
    .Remove(); 

VB

xdoc.Root.<Song> _ 
    .GroupBy(Function(s) CStr(s.Element("Name"))) _ 
    .SelectMany(Function(g) g.Skip(1)) _ 
    .Remove()