Я пытаюсь написать простой алгоритм для чтения двух файлов XML с одинаковыми узлами и структурой, но не обязательно одинаковыми данными внутри дочерних узлов, а не в том же порядке.Как я мог создать простую реализацию для создания третьего, временного XML, являющегося различием между двумя первыми, с использованием Microsoft Diff .DLL?
XML Diff на MSDN:
Инструмент XML Diff and Patch
Инструмент XML Diff and Patch GUI Tool
пример кода XML двух разных файлов XML для сравнения:
<?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>
Требуемый результат (разница между ними)
<?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>
В этом случае я бы, вероятно, использовал XSLT для преобразования результирующего XML-файла "дифференциала" в отсортированный HTML-файл, но я еще не там,Все, что я хочу сделать, это отобразить в третьем файле XML разницу каждого числового значения каждого узла, начиная с дочернего узла "GP".
C # Код, который у меня есть:
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);
}
Это то, что у меня пока есть, но результаты - мусор ... обратите внимание, что для каждого узла "Player" первые три дочерних элемента имеют NOT для сравнения ... Как я могуреализовать это?