in

Drowning In Technical Debt

C# | ASP.NET | SharePoint | SQL | Architecture | SOA |

Scott Roycraft

Red meat is NOT bad for you. Now blue-green meat, THAT'S bad for you! ~ Tommy Smothers

Comparing XML Files

Sometimes a simple way to compare a source simple XML file to a target XML file without the benefit of a schema is needed. While solutions using XSLT and even Microsoft’s XmlDiff exist it seems like the simplest way out is to use the DataSet’s ReadXml() method and a couple of loops 


public static List<string> Compare(string sourceFileName, string targetFileName)
{
      DataSet dsSource = new DataSet("Source");
      DataSet dsTarget = new DataSet("Target");
      List<string> changeLog = new List<string>();

      try
      {
            // load sourceFileName into a dataset
            dsSource.ReadXml(sourceFileName);
            DataColumn[] sourcePrimarykeys = new DataColumn[1];
            sourcePrimarykeys[0] = dsSource.Tables[0].Columns[
"Id"];
            dsSource.Tables[0].PrimaryKey = sourcePrimarykeys;
            // load targetFileName into a dataset
            dsTarget.ReadXml(targetFileName);
            DataColumn[] targetPrimarykeys = new DataColumn[1];
            targetPrimarykeys[0] = dsTarget.Tables[0].Columns[
"Id"];
            dsTarget.Tables[0].PrimaryKey = targetPrimarykeys;
      }
      catch (Exception ex)
      {
            Console.WriteLine("Error: " + ex.Message);
      }

      // Loop through the rows in the source file and see if it exists in the target
      foreach (DataRow sourceRow in dsSource.Tables[0].Rows)
      {
            changeLog.Add(
"Comaring Source Row " + sourceRow["Id"].ToString());
            DataRow targetRow = dsTarget.Tables[0].Rows.Find(sourceRow["Id"].ToString());
            if (targetRow != null)
            {
                  // compare each column in the source file to the target file
                  foreach (DataColumn sourceColumn in dsSource.Tables[0].Columns)
                  {
                        if (sourceRow[sourceColumn.ColumnName].ToString() != 

                               targetRow[sourceColumn.ColumnName].ToString())
                        {
                              changeLog.Add(sourceColumn.ColumnName.ToString() +
" has changed from: "

                              + sourceRow[sourceColumn.ColumnName].ToString() + " to " +
                               targetRow[sourceColumn.ColumnName].ToString());
                        }
                  }
            }
            else
            {
                  changeLog.Add(
"the row cannot be found in the target");
            }
      }

      // determine if there are any rows in target that don't exist in source
      foreach (DataRow targetRow in dsTarget.Tables[0].Rows)
      {
            DataRow sourceRow = dsSource.Tables[0].Rows.Find(targetRow["Id"].ToString());
            if (sourceRow == null)
            {
                  changeLog.Add(
"A row was found in target that doesn't exist in source");
            }
      }

      return changeLog;
}

Published May 06 2007, 11:19 PM by sroycraft
Filed under:

Comments

No Comments
Powered by Community Server (Commercial Edition), by Telligent Systems