Reputation: 11
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]
<?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]
<?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