Sto provando a scrivere un semplice algoritmo per leggere due file XML con gli stessi identici nodi e struttura ma non necessariamente gli stessi dati all'interno dei nodi figlio e non nello stesso ordine . Come potrei creare un'implementazione semplice per la creazione di un terzo XML temporaneo come differenziale tra i primi due, utilizzando Microsoft XML Diff .DLL?Confronto tra due file XML e generazione di un terzo con XMLDiff in C#
XML Diff su MSDN:
http://msdn.microsoft.com/en-us/library/aa302294.aspx
http://msdn.microsoft.com/en-us/library/aa302295.aspx
esempio di codice XML dei due file XML diversi per confrontare:
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-01">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>39</GP>
<G>32</G>
<A>33</A>
<PlusMinus>20</PlusMinus>
<PIM>29</PIM>
</Player>
</Stats>
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-10">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>42</GP>
<G>35</G>
<A>34</A>
<PlusMinus>22</PlusMinus>
<PIM>30</PIM>
</Player>
</Stats>
risultato voluto (differenza tra i due)
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-10">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>3</GP>
<G>3</G>
<A>1</A>
<PlusMinus>2</PlusMinus>
<PIM>1</PIM>
</Player>
</Stats>
In questo caso, probabilmente utilizzerei XSLT per convertire il file "differenziale" XML risultante in un file HTML ordinato, ma non ci sono ancora. Tutto quello che voglio fare è visualizzare nel terzo file XML la differenza di ogni valore numerico di ogni nodo, partendo dal nodo figlio "GP".
codice C# che ho finora:
private void CompareXml(string file1, string file2)
{
XmlReader reader1 = XmlReader.Create(new StringReader(file1));
XmlReader reader2 = XmlReader.Create(new StringReader(file2));
string diffFile = StatsFile.XmlDiffFilename;
StringBuilder differenceStringBuilder = new StringBuilder();
FileStream fs = new FileStream(diffFile, FileMode.Create);
XmlWriter diffGramWriter = XmlWriter.Create(fs);
XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
XmlDiffOptions.IgnoreNamespaces |
XmlDiffOptions.IgnorePrefixes);
bool bIdentical = xmldiff.Compare(file1, file2, false, diffGramWriter);
diffGramWriter.Close();
// cleaning up after we are done with the xml diff file
File.Delete(diffFile);
}
Questo è quello che ho finora, ma i risultati è spazzatura ... notare che per ogni nodo "Player", i primi tre bambini hanno NON da confrontare ... Come posso implementarlo?
Buona domanda, +1. Vedere la mia risposta per due soluzioni: una con una trasformazione XSLT ausiliaria per creare due nuovi documenti XML con solo gli elementi che dovrebbero essere confrontati, l'altra soluzione è completamente XSLT. :) –