Remove nodes from xml document

13. May 2006
If you need to remove nodes from an xml document, here is an example.
This sample clean duplicated nodes and only keeps the last one (according to the date field). 
 
Source.xml (the file to filter) 
 
<?xmlversion="1.0"encoding="utf-8" ?>
<Root>
    <Products>
      <Product>
        <Name>Product1</Name>
        <DataGroup>
          <Data>
            <Name>NABC</Name>
            <Value>VABC</Value>
            <Date>2006-01-10 </Date>
          </Data>
          <Data>
            <Name>NADF</Name>
            <Value>VADF</Value>
            <Date>2006-01-13</Date>
          </Data>
          <Data>
            <Name>NABC</Name>
            <Value>VABC</Value>
            <Date>2006-02-09</Date>
          </Data>
          <Data>
            <Name>NABC</Name>
            <Value>VABC</Value>
            <Date>2006-01-19</Date>
          </Data>
          <Data>
            <Name>NADF</Name>
            <Value>VADF</Value>
            <Date>2006-03-09</Date>
          </Data>
          <Data>
            <Name>NAON</Name>
            <Value>VAON</Value>
            <Date>2006-02-22</Date>
          </Data>
        </DataGroup>
      </Product>
      <Product>
        <Name>Product2</Name>
        <DataGroup>
          <Data>
            <Name>NADF</Name>
            <Value>VADF</Value>
            <Date>2006-01-13</Date>
          </Data>
          <Data>
            <Name>NABC</Name>
            <Value>VABC</Value>
            <Date>2006-01-19</Date>
          </Data>
          <Data>
            <Name>NAON</Name>
            <Value>VAON</Value>
            <Date>2006-03-09</Date>
          </Data>
          <Data>
            <Name>NAON</Name>
            <Value>VAON</Value>
            <Date>2006-04-21</Date>
          </Data>
          <Data>
            <Name>NABC</Name>
            <Value>VABC</Value>
            <Date>2006-05-23</Date>
          </Data>
        </DataGroup>
      </Product>
    </Products>
</Root>
 
Destination.xml (the result after filtering)  
 
<?xmlversion="1.0"encoding="utf-8"?>
<Root>
 <Products>
    <Product>
      <Name>Product1</Name>
      <DataGroup>
        <Data>
          <Name>NABC</Name>
          <Value>VABC</Value>
          <Date>2006-02-09</Date>
        </Data>
        <Data>
          <Name>NADF</Name>
          <Value>VADF</Value>
          <Date>2006-03-09</Date>
        </Data>
        <Data>
          <Name>NAON</Name>
          <Value>VAON</Value>
          <Date>2006-02-22</Date>
        </Data>
      </DataGroup>
    </Product>
    <Product>
      <Name>Product2</Name>
      <DataGroup>
        <Data>
          <Name>NADF</Name>
          <Value>VADF</Value>
          <Date>2006-01-13</Date>
        </Data>
        <Data>
          <Name>NAON</Name>
          <Value>VAON</Value>
          <Date>2006-04-21</Date>
       </Data>
        <Data>
          <Name>NABC</Name>
          <Value>VABC</Value>
          <Date>2006-05-23</Date>
        </Data>
      </DataGroup>
    </Product>
 </Products>
</Root>
 
C# Source with .NET 2.0 
 
XmlDocument xmlSourceDoc = new XmlDocument();
xmlSourceDoc.Load("Source.xml");
XmlNodeList productList = xmlSourceDoc
    .SelectNodes(@"//Root/Products/Product" );
 
SortedDictionary<string, XmlNode> nodesToKeep 
= new SortedDictionary<string, XmlNode>();
 
List<XmlNode> nodesToDelete = new List<XmlNode>();
string dataName;
DateTime dataStoredDate, dataCurrentDate;
XmlNode parentNode;
XmlNodeList dataList; 
 
foreach (XmlNode product in productList)
{
    nodesToKeep.Clear();
    nodesToDelete.Clear(); 
 
    dataList = product.SelectNodes(@"DataGroup/Data" );
 
    foreach (XmlNode data in dataList)
    {
        dataName = data.SelectSingleNode("Name").InnerText; 
 
        if (nodesToKeep.ContainsKey(dataName))
        {
            dataStoredDate = DateTime.Parse(nodesToKeep[dataName]
                .SelectSingleNode("Date").InnerText);
            dataCurrentDate = DateTime.Parse(data 
                .SelectSingleNode("Date").InnerText);
 
            if (dataStoredDate < dataCurrentDate)
            {
                nodesToDelete.Add(nodesToKeep[dataName]);
                nodesToKeep[dataName] = data;
            }
            else
                nodesToDelete.Add(data);
        }
        else
            nodesToKeep.Add(dataName, data); 
    }
 
    parentNode = product.SelectSingleNode(@"DataGroup" );
 
    foreach (XmlNode nodeToDelete in nodesToDelete)
    {
        parentNode.RemoveChild(nodeToDelete); 
    }
}
 
xmlSourceDoc.Save("Destination.xml");
 
 

Your can download the project here : XmlRemover.rar  

XML, Web Services, .NET Projects , ,

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading