https://github.com/sflynn1812/xslt-diff

аюсь написать простой алгоритм для чтения двух файлов XML с одинаковыми узлами и структурой, но не обязательно одинаковыми данными внутри дочерних узлов, а не в том же порядке. Как я мог создать простую реализацию для создания третьего, временного XML, являющегося различием между двумя первыми, используя Microsoft Diff .DLL?

XML Diff на MSDN:

XML Diff and Patch Tool

Инструмент XML Diff and Patch GUI

Пример 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" первые три дочерних элемента имеютНЕ для сравнения ... Как я могу это реализовать?

Ответы на вопрос(0)

Ваш ответ на вопрос