2012-11-08 21 views
2

下面是示例xml。如何從xml文檔中刪除重複元素而不使用c#繪製xml結構#

<?xml version="1.0"?> 
<Terms> 
    <Term Id="D7923D9888BF100482C2CB8225D5863E" Name="Television" IsPlaceholder="false" /> 
    <Term Id="F25AF2D07E4E100484F5DF092526B43E" Name="General news" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="04969DF089DA10048141D56C852D093E" Name="Bombings" IsPlaceholder="false" /> 
     <Term Id="0E8CF338896510048024D56C852D093E" Name="Protests and demonstrations" IsPlaceholder="false" /> 
     <Term Id="17956128897810048CE8D56C852D093E" Name="Law and order" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="3EC37E763F534FDB8A10C63768DAD1B7" Name="Executions" IsPlaceholder="false" /> 
     <Term Id="78C99FE8829F100481B5DF092526B43E" Name="Trials" IsPlaceholder="false" /> 
     <Term Id="C72CC1E048566AE2AC3A6923E" Name="Prison breaks" IsPlaceholder="false" /> 
     <Term Id="CD42D04856EAE2AC3A6923E" Name="Prison riots" IsPlaceholder="false" /> 
    </ChildTerms> 
    </Term> 
    <Term Id="31711EC0894B10048983BA0A2B2CA13E" Name="Accidents and disasters" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="2D777E23418C4A61AB869F88F0CC22B5" Name="Industrial accidents" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="6EF1C04850DAE2AC3A6923E" Name="Mining accidents" IsPlaceholder="false" /> 
      <Term Id="77A15F9213344CF8AEFBD6560C618C9A" Name="Oil spills" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="439E22A0894B100489C4BA0A2B2CA13E" Name="Structural failures" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="513CDC30894B10048A8E87A309043C03" Name="Bridge collapses" IsPlaceholder="false" /> 
      <Term Id="513D0340894B10048A8E87A309043C03" Name="Building collapses" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="58AD538091C7100480A9A55C96277D3E" Name="Evacuations" IsPlaceholder="false" /> 
     <Term Id="6B5B04B0882F100480E6AE2AC3A6923E" Name="Fires" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="69D001C8896410048EBBD56C852D093E" Name="Residential fires" IsPlaceholder="false" /> 
      <Term Id="6C61CA38882F10048FA88BB2970C7204" Name="Wildfires" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="6C633968882F10048FA88BB2970C7204" Name="Floods" IsPlaceholder="false" /> 
     <Term Id="7448DD4882A0100481DDDF092526B43E" Name="Natural disasters" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="6C61CA38882F10048FA88BB2970C7204" Name="Wildfires" IsPlaceholder="false" /> 
      <Term Id="6C615120882F10048FA68BB2970C7204" Name="Earthquakes" IsPlaceholder="false" /> 
      <Term Id="6C618FA0882F10048FA78BB2970C7204" Name="Tsunamis" IsPlaceholder="false" /> 
      <Term Id="6C6281D0882F10048FA88BB2970C7204" Name="Droughts" IsPlaceholder="false" /> 
      <Term Id="6C62C050882F10048FA88BB2970C7204" Name="Landslides and mudslides" IsPlaceholder="false" /> 
      <Term Id="6C633968882F10048FA98BB2970C7204" Name="Avalanches" IsPlaceholder="false" /> 
      <Term Id="A6F2C1C887E110048A6E8BEAE5FD5C07" Name="Tornados" IsPlaceholder="false" /> 
      <Term Id="B4600998883010048C189528EB155503" Name="Volcanic eruptions" IsPlaceholder="false" /> 
      <Term Id="DC90FFA0686948409257760CC35E98EB" Name="Tropical cyclones" IsPlaceholder="false"> 
      <ChildTerms> 
       **<Term Id="6C6377E8882F10048FAB8BB2970C7204" Name="Hurricanes" IsPlaceholder="false" />** 
       <Term Id="A6F2C1C887E110048A6D8BEAE5FD5C07" Name="Tropical storms" IsPlaceholder="false" /> 
      </ChildTerms> 
      </Term> 
     </ChildTerms> 
     </Term> 
     <Term Id="B6503CF08830100482EFAE2AC3A6923E" Name="Power outages" IsPlaceholder="false" /> 
     <Term Id="CCC363A0882F10048140AE2AC3A6923E" Name="Explosions" IsPlaceholder="false" /> 
     <Term Id="E20E7174E0154782B8733D180A799D34" Name="Transportation accidents" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="3C105048882F100489FD9528EB155503" Name="Automotive accidents" IsPlaceholder="false" /> 
      <Term Id="3C107758882F100489FE9528EB155503" Name="Maritime accidents" IsPlaceholder="false" /> 
      <Term Id="41687660882F10048A199528EB155503" Name="Plane crashes" IsPlaceholder="false" /> 
      <Term Id="6AA161B575F64C62993BC3E9CD82BB69" Name="Rail accidents" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
    </ChildTerms> 
    </Term> 
    <Term Id="48612B807C2B4B93BBBACBF54F547AD5" Name="Crime" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="13C6A480899B10048B9DD56C852D093E" Name="Violent crime" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="5018B8F4DED948128561C5AF2144CA66" Name="Shootings" IsPlaceholder="false"> 
      <ChildTerms> 
       <Term Id="312A72707E8510048A118087FC32D30C" Name="School shootings" IsPlaceholder="false" /> 
      </ChildTerms> 
      </Term> 
      <Term Id="92DD72A8899B10048F2CD56C852D093E" Name="Assassinations" IsPlaceholder="false" /> 
      <Term Id="C5A59C298A2A4A36A618EFB20DF09A3C" Name="Homicide" IsPlaceholder="false" /> 
      <Term Id="FCAF54924FA3415DA977901DDB1E2EA7" Name="Gang-related crime" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="CA356A4172C64D3FA631803BA6CCC074" Name="Arson" IsPlaceholder="false" /> 
     <Term Id="CD80007770234E6AA95991F7D3B0C737" Name="Hate crimes" IsPlaceholder="false" /> 
    </ChildTerms> 
    </Term> 
    <Term Id="5F7806EEC29A4884B038A26D799E9326" Name="Strikes" IsPlaceholder="false" /> 
    <Term Id="5FC806A87DF7100483EBDF092526B43E" Name="Weather" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="A6F2C1C887E110048A6E8BEAE5FD5C07" Name="Tornados" IsPlaceholder="false" /> 
     <Term Id="88C2A7E08886100487FECB8225D5863E" Name="Storms" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="DC90FFA0686948409257760CC35E98EB" Name="Tropical cyclones" IsPlaceholder="false"> 
      <ChildTerms> 
       **<Term Id="6C6377E8882F10048FAB8BB2970C7204" Name="Hurricanes" IsPlaceholder="false" />** 
       <Term Id="A6F2C1C887E110048A6D8BEAE5FD5C07" Name="Tropical storms" IsPlaceholder="false" /> 
      </ChildTerms> 
      </Term> 
      <Term Id="59143B3791444BF7BD11992B42B8EA2E" Name="Wind storms" IsPlaceholder="false" /> 
      <Term Id="A6F248B087E110048A6B8BEAE5FD5C07" Name="Blizzards" IsPlaceholder="false" /> 
      <Term Id="A6F2873087E110048A6C8BEAE5FD5C07" Name="Thunderstorms" IsPlaceholder="false" /> 
      <Term Id="A6F3004887E110048A6F8BEAE5FD5C07" Name="Ice storms" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
    </ChildTerms> 
    </Term> 
    <Term Id="7CF243908830100481E9AE2AC3A6923E" Name="War and unrest" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="3510D930896410048E5CD56C852D093E" Name="Genocides" IsPlaceholder="false" /> 
     <Term Id="535DB0484DBAE2AC3A6923E" Name="Troop withdrawals" IsPlaceholder="false" /> 
     <Term Id="5FEF4190897910048240D56C852D093E" Name="Massacres" IsPlaceholder="false" /> 
     <Term Id="6BCC38A43C5C4BC196FB108112EAA6C1" Name="Civil wars" IsPlaceholder="false" /> 
     <Term Id="98C3B8C5D6AF41C296A3CA1E4C0977ED" Name="Terrorism" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="D7F9E33889701004837FD56C852D093E" Name="Terrorist attacks" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="9BEC03A0883310048673AE2AC3A6923E" Name="Military occupations" IsPlaceholder="false" /> 
     <Term Id="B9779BC8896410048F4CD56C852D093E" Name="Troop deployments" IsPlaceholder="false" /> 
    </ChildTerms> 
    </Term> 
    <Term Id="877CB3C0899A10048ABBD56C852D093E" Name="Transportation" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="E20E7174E0154782B8733D180A799D34" Name="Transportation accidents" IsPlaceholder="false"> 
     <ChildTerms> 
      <Term Id="3C105048882F100489FD9528EB155503" Name="Automotive accidents" IsPlaceholder="false" /> 
      <Term Id="3C107758882F100489FE9528EB155503" Name="Maritime accidents" IsPlaceholder="false" /> 
      <Term Id="41687660882F10048A199528EB155503" Name="Plane crashes" IsPlaceholder="false" /> 
      <Term Id="6AA161B575F64C62993BC3E9CD82BB69" Name="Rail accidents" IsPlaceholder="false" /> 
     </ChildTerms> 
     </Term> 
     <Term Id="9031A908899A10048BAFCECE19677003" Name="Traffic" IsPlaceholder="false" /> 
     <Term Id="90321E38899A10048BAFCECE19677003" Name="Air travel disruptions" IsPlaceholder="false" /> 
     <Term Id="90321E38899A10048BB0CECE19677003" Name="Rail travel disruptions" IsPlaceholder="false" /> 
    </ChildTerms> 
    </Term> 
    <Term Id="9D48E670883110048405AE2AC3A6923E" Name="International incidents" IsPlaceholder="false" /> 
    <Term Id="A0433408883010048BE79528EB155503" Name="Riots" IsPlaceholder="false" /> 
    <Term Id="CAEFF3958DE64F4D989F5EF1209BD073" Name="Humanitarian crises" IsPlaceholder="false"> 
    <ChildTerms> 
     <Term Id="463C2098896410048E93D56C852D093E" Name="Famine" IsPlaceholder="false" /> 
    </ChildTerms> 
    </Term> 
    <Term Id="CE211E3891B0100483C1A55C96277D3E" Name="Record setting events" IsPlaceholder="false" /> 
    <Term Id="DA6509F88971100486C5D56C852D093E" Name="Search and rescue efforts" IsPlaceholder="false" /> 
</ChildTerms> 

,你可以看到有對颶風兩個條目(請找**的elment前標記),我只是想刪除使用LINQ。我想他們中的任何一個,但它正在塗抹xml的結構。請幫助我。

回答

3

LINQ解決方案刪除所有重複和保持一個

XElement xml = XElement.Load("data.xml"); 

string toRemove ="Hurricanes"; 

//Find the Number of Duplicates 
int duplicateCount=xml.Descendants("Term") 
         .GroupBy(xe => xe.Attribute("Name").Value) 
         .Where(x => x.Key == toRemove) 
         .Select<IGrouping<string, XElement>, int>(y => y.Count()) 
         .First(); 

//Remove all duplicates but one 
xml.Descendants("Term").Where(xe => xe.Attribute("Name").Value == toRemove) 
         .Take(duplicateCount-1) 
         .Remove(); 

xml.Save("moddata.xml"); 
+0

刪除第一個元素,如果你只有2個颶風,它就會起作用。如果你有更多的東西,你需要移除除第一個以外的所有東西,或者你可以使用上面的代碼,並且圍繞計算出現次數放置一個while循環,如果有超過1個颶風元素,繼續移除。 – Matt

+0

但我不能硬編碼一個屬性的值。它可能明天我將不得不刪除另一個不同元素的重複。例如: - 它可能發生在「Tornados」。 – Ppm

+0

你可以很容易地用一個字符串變量替換它,如果你想它it.i硬編碼,所以它很容易理解 –

1

我可能會嘗試使用XPath。您可以使用的XDocument的XPathSelectElements方法來獲取與「颶風」的值的名稱屬性的元素列表:

http://msdn.microsoft.com/en-us/library/bb342176%28v=vs.90%29.aspx

投擲,通過使用ToList,然後調用刪除元素融入到一個IList的IEnumerable的名單每個節點上:

http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.remove.aspx

這應該刪除所有來自任何地方的XML樹中存在的元素。

+0

我真的不能硬編碼找到特定的元素,並刪除,因爲在未來的XML可能會發生變化,可能是有可能的,而不是颶風,將有名稱「龍捲風」重複的元素。 – Ppm

相關問題