blog.easyciel.net author="Patrick Rabian" about="c#, sharepoint, biztalk, team system resources" more="news, samples, tips for .NET world's developers !"

Remove nodes from xml document

Friday, 12 May 2006 23:54 by prabian

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  

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Related posts

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]