Сравните 2 XML-файла, используя только C # - PullRequest
1 голос
/ 11 января 2011

Я ищу способ сравнить файлы XML (примеры ниже) и создать список, содержащий xpath для различий в двух файлах, чтобы затем я мог проверить, что изменилось.

это можно сделать в Linq или мне нужно будет использовать патч MS Diff, я действительно хотел бы сделать все это на C # без каких-либо дополнительных Dlls.

Или я должен просто зациклить один XML-файл и сравнить его с другим, но тогда, если я сделаю это, я могу пропустить новые или удаленные узлы!

Файл A

<info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum>1</LNameNum>
      <NumPeople>1</NumPeople>
      <NameType/>
      <LName>TEST</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>B test</Comment>
    </Segment>
  </Retrieve>
</info>

Файл B:

    <info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum>1</LNameNum>
      <NameType/>
      <LName>TESTING</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Status>HS</Status>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>COULD I USE LINQ</Comment>
    </Segment>
  </Retrieve>
</info>

Вывод списка XPath

/info/Retrieve/LastNameInfo/NumPeople
/info/Retrieve/LastNameInfo/LName
/info/Retrieve/Segment[1]/Status
/info/Retrieve/Segment[2]/Comment

1 Ответ

1 голос
/ 11 января 2011

Полагаю, вы хотите сравнить эквивалентность XML (Infoset), а не только лексическую эквивалентность файлов.XML может значительно различаться по своей лексической форме (выбор цитаты, пробел в несущественном порядке, порядок атрибутов).Все они могут быть изменены, не затрагивая информационный набор.

Я бы канонизировал файлы Алгоритм канонизации XML дает два отличных результата при непосредственном вызове, чем при вызове как часть цифровой подписи xml? и testдля лексической идентичности.Если они не эквивалентны, может быть довольно трудно определить, где они отличаются (тривиальные различия относительно просты, но когда важен порядок элементов и т. Д., Объективной разницы может не быть.

Я сделал это для своегособственное приложение (на Java, извините), и оно не было тривиальным - и снова я предположил довольно близкую эквивалентность между файлами. Я также заставил его работать для реальных чисел, которые должны были согласовываться в epsilon, где лексическая эквивалентность недостаточно хороша.

см. Сравнение XML в C # для некоторых инструментов XMLDiff

...