c# - 如何使用 C# 从 xml 文档中删除重复元素而不用乱写 xml 结构

标签 c# linq xml-parsing linq-to-xml

下面是示例 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="C72CC1E0883210048566AE2AC3A6923E" Name="Prison breaks" IsPlaceholder="false" />
       <Term Id="CD42D51088321004856EAE2AC3A6923E" 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="6EF1C84088321004850DAE2AC3A6923E" 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="535DB1708832100484DBAE2AC3A6923E" 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>

如您所见,有两个飓风条目(请在元素之前找到 ** 标记),我只想删除其中任何一个。我尝试使用 Linq,但它正在乱写XML 的结构。请帮帮我。

最佳答案

删除所有重复项并保留一个的 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");

关于c# - 如何使用 C# 从 xml 文档中删除重复元素而不用乱写 xml 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13283012/

相关文章:

c# - 如何在 C#/Silverlight 中绑定(bind) DatePicker 的 "date"?

c# - LINQ 中的 If Else

xml - 如何使用其 baseName 而不是 Item(#) 选择 XML 子节点?

Linq 简单 XML 片段到非匿名类型

java - 在 Java 中读写 XML 文件的问题

javascript - 从 Xamarin Forms 中的 WebView 获取数据

c# - 在 radGrid 中打印数据后允许分页 Telerik Asp.Net

c# - RabbitMQ C# 实例

c# - 如何在 C#/.NET 中使用 LINQ 表达式树调用 lambda

c# - Linq - 从表达式 <T2> 创建表达式 <T1>