2015-06-19 128 views
0

我想删除我的XML中的重复记录,但到目前为止我无法确定如何去做这件事,这里是xml,你可以看到有4个重复的记录。我想删除itemGrp节点由于另一itemGrp节点删除重复的XML记录

<?xml version="1.0" encoding="utf-8" ?> 
<Fare_1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Fare_1_Details xmlns="http://xml.someplace"> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>01</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>DT21P</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>725</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>02</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>DT21P</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>725</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>03</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>CV76J</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>352</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    </Fare_1_Details> 
    <Fare_1_Details xmlns="http://xml.someplace"> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>01</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>TH31L</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>722</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>02</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>GK51T</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>726</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    <itemGrp> 
     <itemNb> 
     <itemNumberDetails> 
      <number>03</number> 
     </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
     <additionalFareDetails> 
      <rateClass>GK51T</rateClass> 
     </additionalFareDetails> 
     <discountDetails> 
      <fareQualifier>726</fareQualifier> 
     </discountDetails> 
     </fareQualifItem> 
    </itemGrp> 
    </Fare_1_Details> 
</Fare_1> 

具有相同rateClass元素我想什么用的XmlDocument至今:

NameTable nt = new NameTable(); 
XmlNamespaceManager m = new XmlNamespaceManager(nt); 
m.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
m.AddNamespace("a", "http://xml.someplace"); 
XmlNodeList nodes = xmlTree.SelectNodes("//Fare_1/Fare_1_Details/itemGrp", m); 
XmlNode actionNode = xmlTree.SelectSingleNode("//Fare_1"); 
for (int i = 1; i < nodes.Count; i++) 
{ 
    actionNode.RemoveChild(nodes[i]); 
} 
+0

说到重复,你是专指itemGrp节点还是删除所有重复项? – Oluwafemi

+0

itemGrp节点我想删除整个节点以及由于相同的rateclass元素导致的任何childeren – Developer

+0

如何解析XML?代码在哪里? – HappyLee

回答

1

我已经能来通过编写此代码为您提供解决方案:

string file = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "xml.txt"); 
      var xmlDoc = new XmlDocument(); 
      xmlDoc.LoadXml(file); 
      var el = xmlDoc.SelectSingleNode("/Fare_1"); 
      var c = el.ChildNodes; 
      List<string> rateClassValues = new List<string>(); 
      foreach (XmlNode x in c) 
      { 
       foreach(XmlNode ch in x.ChildNodes) 
       { 
        var rateClassValue = ch.FirstChild.NextSibling.FirstChild.FirstChild.InnerText; 
        if (!rateClassValues.Contains(rateClassValue)) 
        { 
         // add value to list to keep track of rate class values 
         rateClassValues.Add(rateClassValue); 
        } 
        else if (rateClassValues.Contains(rateClassValue)) 
        { 
         // delete duplicate itemGrp from parent 
         XmlNode parent = ch.ParentNode; 
         parent.RemoveChild(ch); 
        } 
       } 
      } 

      xmlDoc.Save(AppDomain.CurrentDomain.BaseDirectory + "xmlNew.txt"); 

此代码将删除任何具有重复rateClass innerText的ItemGrp。运行该代码给出了这样的结果:

<?xml version="1.0" encoding="UTF-8"?> 
<Fare_1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Fare_1_Details xmlns="http://xml.someplace"> 
     <itemGrp> 
     <itemNb> 
      <itemNumberDetails> 
       <number>01</number> 
      </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
      <additionalFareDetails> 
       <rateClass>DT21P</rateClass> 
      </additionalFareDetails> 
      <discountDetails> 
       <fareQualifier>725</fareQualifier> 
      </discountDetails> 
     </fareQualifItem> 
     </itemGrp> 
     <itemGrp> 
     <itemNb> 
      <itemNumberDetails> 
       <number>03</number> 
      </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
      <additionalFareDetails> 
       <rateClass>CV76J</rateClass> 
      </additionalFareDetails> 
      <discountDetails> 
       <fareQualifier>352</fareQualifier> 
      </discountDetails> 
     </fareQualifItem> 
     </itemGrp> 
    </Fare_1_Details> 
    <Fare_1_Details xmlns="http://xml.someplace"> 
     <itemGrp> 
     <itemNb> 
      <itemNumberDetails> 
       <number>01</number> 
      </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
      <additionalFareDetails> 
       <rateClass>TH31L</rateClass> 
      </additionalFareDetails> 
      <discountDetails> 
       <fareQualifier>722</fareQualifier> 
      </discountDetails> 
     </fareQualifItem> 
     </itemGrp> 
     <itemGrp> 
     <itemNb> 
      <itemNumberDetails> 
       <number>02</number> 
      </itemNumberDetails> 
     </itemNb> 
     <fareQualifItem> 
      <additionalFareDetails> 
       <rateClass>GK51T</rateClass> 
      </additionalFareDetails> 
      <discountDetails> 
       <fareQualifier>726</fareQualifier> 
      </discountDetails> 
     </fareQualifItem> 
     </itemGrp> 
    </Fare_1_Details> 
</Fare_1> 

我希望我能够打到要害。干杯!