Xoxo
Xoxo

Reputation: 11

XmlDiff and Patch Use Scenario in https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/aa302294(v=msdn.10)

I have to be able to compare two xmls which are from the same xsd, get differences including addition, deletion and update. I also need to get a value before the update if update has happened.

XmlDiff and Patch looked promising and I decided to write some codes to try myself based on the example in the article, but I have various different patched-up results depending on how the second xml looks like.

This is my spiked code.

public void TestDiffGram()
{
    using (var sw = new StringWriter(CultureInfo.InvariantCulture))
    {
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;

        using (var xw = XmlWriter.Create(sw, settings))
        {
            var ignore = XmlDiffOptions.IgnoreWhitespace |
            XmlDiffOptions.IgnorePrefixes |
            XmlDiffOptions.IgnoreNamespaces;

            var xmldiff = new XmlDiff(ignore);
            xmldiff.Algorithm = XmlDiffAlgorithm.Fast;
            xmldiff.Compare("c://Temp//xml1.xml", "c://Temp//xml2.xml", false, xw);
            xw.Close();
        }

        File.WriteAllText("c://Temp//diffgram.xml", sw.ToString());

        XmlDocument sourceDoc = new XmlDocument(new NameTable());
        sourceDoc.LoadXml(File.ReadAllText("c://Temp//xml1.xml"));
        XmlTextReader diffgramReader = new XmlTextReader("c://Temp//diffgram.xml");
        new XmlPatch().Patch(sourceDoc, diffgramReader);

        XmlTextWriter output = new XmlTextWriter("c://Temp//test.xml", Encoding.Unicode);
        sourceDoc.Save(output);
        output.Close();
    }
}

xml1.xml and xml2.xml are variations of two xmls in the article.

1. Experiment 1

Two xmls have the same number of "model"s in the same order, but have Outback's two tags updated in the second xml.

[xml1.xml]

<PartPriceInfo xmlns:ns1="http://www.Subaru.com">
   <ns1:Subaru model="Outback">
      <ns1:Muffler> 500 </ns1:Muffler>
      <ns1:Bumper> 150 </ns1:Bumper>
      <ns1:Floormat> 75 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
   <ns1:Subaru model="Legacy">
      <ns1:Muffler> 400 </ns1:Muffler>
      <ns1:Bumper> 100 </ns1:Bumper>
      <ns1:Floormat> 50 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
</PartPriceInfo>

[xml2.xml]

<PartPriceInfo xmlns:ns2="http://www.Subaru.com">
   <ns2:Subaru model="Outback">
      <ns2:Muffler> 600 </ns2:Muffler>
      <ns2:Bumper> 150 </ns2:Bumper>
      <ns2:Floormat> 75 </ns2:Floormat>
      <ns2:WindShieldWipers> 25 </ns2:WindShieldWipers>
   </ns2:Subaru>
   <ns2:Subaru model="Legacy">
      <ns2:Muffler> 400 </ns2:Muffler>
      <ns2:Bumper> 100 </ns2:Bumper>
      <ns2:Floormat> 50 </ns2:Floormat>
      <ns2:WindShieldWipers> 20 </ns2:WindShieldWipers>
   </ns2:Subaru>
</PartPriceInfo>

[Patched-up results]

The model Outback has those two elements which are updated, but I expect that the prefix would be ns2, but it is ns1 as below. Why is this?

<?xml version="1.0" encoding="UTF-8"?>
<PartPriceInfo xmlns:ns1="http://www.Subaru.com">
   <ns1:Subaru model="Outback">
      <ns1:Muffler>600</ns1:Muffler>
      <ns1:Bumper>150</ns1:Bumper>
      <ns1:Floormat>75</ns1:Floormat>
      <ns1:WindShieldWipers>25</ns1:WindShieldWipers>
   </ns1:Subaru>
   <ns1:Subaru model="Legacy">
      <ns1:Muffler>400</ns1:Muffler>
      <ns1:Bumper>100</ns1:Bumper>
      <ns1:Floormat>50</ns1:Floormat>
      <ns1:WindShieldWipers>20</ns1:WindShieldWipers>
   </ns1:Subaru>
</PartPriceInfo>

2. Experiment 2

The second xml has Outback's two tags updated and one new model Impreza. This is what is described in the article.

[xml1.xml]

<PartPriceInfo xmlns:ns1="http://www.Subaru.com">
   <ns1:Subaru model="Outback">
      <ns1:Muffler> 500 </ns1:Muffler>
      <ns1:Bumper> 150 </ns1:Bumper>
      <ns1:Floormat> 75 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
   <ns1:Subaru model="Legacy">
      <ns1:Muffler> 400 </ns1:Muffler>
      <ns1:Bumper> 100 </ns1:Bumper>
      <ns1:Floormat> 50 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
</PartPriceInfo>

[xml2.xml]

<PartPriceInfo xmlns:ns2="http://www.Subaru.com">
   <ns2:Subaru model="Outback">
      <ns2:Muffler> 600 </ns2:Muffler>
      <ns2:Bumper> 150 </ns2:Bumper>
      <ns2:Floormat> 75 </ns2:Floormat>
      <ns2:WindShieldWipers> 25 </ns2:WindShieldWipers>
   </ns2:Subaru>
   <ns2:Subaru model="Legacy">
      <ns2:Muffler> 400 </ns2:Muffler>
      <ns2:Bumper> 100 </ns2:Bumper>
      <ns2:Floormat> 50 </ns2:Floormat>
      <ns2:WindShieldWipers> 20 </ns2:WindShieldWipers>
   </ns2:Subaru>
   <ns2:Subaru model="Impreza">
      <ns2:Muffler> 450 </ns2:Muffler>
      <ns2:Bumper> 120 </ns2:Bumper>
      <ns2:Floormat> 65 </ns2:Floormat>
      <ns2:WindShieldWipers> 20 </ns2:WindShieldWipers>
   </ns2:Subaru>
</PartPriceInfo>

[Patched-up results]

  1. Outback Muffler has its prefix ns1, but WindShieldWipers's one is ns2 while both are updated from the second xml. Does anyone understand why Outback Muffler prefix is ns1?
  2. All of elements of Impreza should have its prefix ns2 as this model does not appear in the original xml, but has WindShieldWipers ns1. Why is this?
    <?xml version="1.0" encoding="UTF-8"?>
    <PartPriceInfo xmlns:ns1="http://www.Subaru.com">
       <ns1:Subaru model="Outback">
          <ns1:Muffler>600</ns1:Muffler>
          <ns1:Bumper>150</ns1:Bumper>
          <ns1:Floormat>75</ns1:Floormat>
          <ns2:WindShieldWipers xmlns:ns2="http://www.Subaru.com">25</ns2:WindShieldWipers>
       </ns1:Subaru>
       <ns1:Subaru model="Legacy">
          <ns1:Muffler>400</ns1:Muffler>
          <ns1:Bumper>100</ns1:Bumper>
          <ns1:Floormat>50</ns1:Floormat>
          <ns1:WindShieldWipers>20</ns1:WindShieldWipers>
       </ns1:Subaru>
       <ns2:Subaru xmlns:ns2="http://www.Subaru.com" model="Impreza">
          <ns2:Muffler>450</ns2:Muffler>
          <ns2:Bumper>120</ns2:Bumper>
          <ns2:Floormat>65</ns2:Floormat>
          <ns1:WindShieldWipers>20</ns1:WindShieldWipers>
       </ns2:Subaru>
    </PartPriceInfo>

3. Experiment 3

The second xml has the model Legacy removed, a new model Impreza added and the model Outback's two tags updated.

[xml1.xml]

<PartPriceInfo xmlns:ns1="http://www.Subaru.com">
   <ns1:Subaru model="Outback">
      <ns1:Muffler> 500 </ns1:Muffler>
      <ns1:Bumper> 150 </ns1:Bumper>
      <ns1:Floormat> 75 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
   <ns1:Subaru model="Legacy">
      <ns1:Muffler> 400 </ns1:Muffler>
      <ns1:Bumper> 100 </ns1:Bumper>
      <ns1:Floormat> 50 </ns1:Floormat>
      <ns1:WindShieldWipers> 20 </ns1:WindShieldWipers>
   </ns1:Subaru>
</PartPriceInfo>

[xml2.xml]

<PartPriceInfo xmlns:ns2="http://www.Subaru.com">
   <ns2:Subaru model="Outback">
      <ns2:Muffler> 600 </ns2:Muffler>
      <ns2:Bumper> 150 </ns2:Bumper>
      <ns2:Floormat> 75 </ns2:Floormat>
      <ns2:WindShieldWipers> 25 </ns2:WindShieldWipers>
   </ns2:Subaru>
   <ns2:Subaru model="Impreza">
      <ns2:Muffler> 450 </ns2:Muffler>
      <ns2:Bumper> 120 </ns2:Bumper>
      <ns2:Floormat> 65 </ns2:Floormat>
      <ns2:WindShieldWipers> 20 </ns2:WindShieldWipers>
   </ns2:Subaru>
</PartPriceInfo>

[Patched-up results]

  1. Updated tags of Outback should have the prefix ns2, but only one of them has it??
  2. All of Impreza's tags should be ns2, but they are all ns1??
    <?xml version="1.0" encoding="UTF-8"?>
    <PartPriceInfo xmlns:ns1="http://www.Subaru.com">
       <ns1:Subaru model="Outback">
          <ns1:Muffler>600</ns1:Muffler>
          <ns1:Bumper>150</ns1:Bumper>
          <ns1:Floormat>75</ns1:Floormat>
          <ns2:WindShieldWipers xmlns:ns2="http://www.Subaru.com">25</ns2:WindShieldWipers>
       </ns1:Subaru>
       <ns1:Subaru model="Impreza">
          <ns1:Muffler>450</ns1:Muffler>
          <ns1:Bumper>120</ns1:Bumper>
          <ns1:Floormat>65</ns1:Floormat>
          <ns1:WindShieldWipers>20</ns1:WindShieldWipers>
       </ns1:Subaru>
    </PartPriceInfo>

My expectation is that if a patched-up result has its value from a second file, then it would be associated with the prefix ns2, but sometimes it does. Sometimes it does not. Is my expectation not right? I would be happy to be corrected on the expectation.

Xoxo

Upvotes: 1

Views: 49

Answers (0)

Related Questions