Mark Smith
Mark Smith

Reputation: 65

Using XmlDiffPatch when writing to stream

I am trying to use xmldiffpatch to write to a stream.

The first method is to write my xml to a memory stream. The second method loads an xml from a file and creates a stream for the patched file to be written into. The third method actually compares the two files. I'm always getting that both files are identical, even though they are not, so I know that I am missing something.

Any help is appreciated!

public MemoryStream FirstXml() 

    {
        string[] names = { "John", "Mohammed", "Marc", "Tamara", "joy" };
        MemoryStream ms = new MemoryStream();
        XmlTextWriter xtw= new XmlTextWriter(ms, Encoding.UTF8);

        xtw.WriteStartDocument();
        xtw.WriteStartElement("root");

        foreach (string s in names)
        {
        xtw.WriteStartElement(s);
        xtw.WriteEndElement();
        }
        xtw.WriteEndElement();
        xtw.WriteEndDocument();
        return ms;
    }

    public Stream SecondXml()
    {
        XmlReader finalFile =XmlReader.Create(@"c:\......\something.xml");
        MemoryStream ms = FirstXml();
        XmlReader originalFile = XmlReader.Create(ms);
        MemoryStream ms2 = new MemoryStream();
        XmlTextWriter dgw = new XmlTextWriter(ms2, Encoding.UTF8);
        GenerateDiffGram(originalFile, finalFile, dgw);
        return ms2;
    }

    public void GenerateDiffGram(XmlReader originalFile, XmlReader finalFile,
                                XmlWriter dgw)
    {
        XmlDiff xmldiff = new XmlDiff();
        bool bIdentical = xmldiff.Compare(originalFile, finalFile, dgw);
        dgw.Close();
        StreamReader sr = new StreamReader(SecondXml());
        string xmlOutput = sr.ReadToEnd();
        if(xmlOutput.Contains("</xd:xmldiff>"))
        {Console.WriteLine("Xml files are not identical");
            Console.Read();}

        else
        {Console.WriteLine("Xml files are identical");Console.Read();}

    }

Upvotes: 1

Views: 1960

Answers (1)

Samuel Neff
Samuel Neff

Reputation: 74929

The following modified version works.

static void Main()
{
    SecondXml();
}

public static string FirstXml()
{
    string[] names = { "John", "Mohammed", "Marc", "Tamara", "joy" };
    var sw = new StringWriter();
    var xtw = new XmlTextWriter(sw);

    xtw.WriteStartDocument();
    xtw.WriteStartElement("root");

    foreach (string s in names)
    {
        xtw.WriteStartElement(s);
        xtw.WriteEndElement();
    }
    xtw.WriteEndElement();
    xtw.WriteEndDocument();

    return sw.ToString();
}

public static void SecondXml()
{
    string secondXml = File.ReadAllText(@"t:\something.xml");
    string firstXml = FirstXml();

    Console.WriteLine("Comparing...");

    string result = GenerateDiffGram(firstXml, secondXml);

    Console.WriteLine(result);

    Console.WriteLine();
    Console.WriteLine("Finished compare");


    Console.Out.Write(firstXml);

    Console.WriteLine();

    Console.WriteLine();

    Console.WriteLine(secondXml);
}

public static string GenerateDiffGram(string originalFile, string finalFile)
{
    var xmldiff = new XmlDiff();
    var r1 = XmlReader.Create(new StringReader(originalFile));
    var r2 = XmlReader.Create(new StringReader(finalFile));
    var sw = new StringWriter();
    var xw = new XmlTextWriter(sw) {Formatting = Formatting.Indented};
    bool bIdentical = xmldiff.Compare(r1, r2, xw);
    Console.WriteLine();
    Console.WriteLine("bIdentical: " + bIdentical);

    return sw.ToString();
}

I'm actually not entirely sure what's wrong with your original code. The XML being compared is an empty string in both the first and second readers. Since you're using memory streams as the backing stores anyways, then you won't lose anything by just using strings as the above does.

Upvotes: 1

Related Questions