Как проверить эквивалентность двух XML-документов? - PullRequest
0 голосов
/ 27 сентября 2018

Из моей программы я вызываю XSLT-процессор командной строки (такой как Saxon или xsltproc).

Затем (для целей тестирования) я хочу сравнить выходные данные процессора с предопределенной строкой.

Проблема в том, что XML можно отформатировать по-разному.Следующие три являются разными строками:

<?xml version="1.0" encoding="utf-8"?>
<x/>

<?xml version="1.0"?>
<x/>

<?xml version="1.0"?>
<x
/>

Как проверить вывод различных процессоров XSLT на соответствие заданной строке XML?

Может быть, есть способ (не обязательно стандартизированный) для разных XSLTпроцессоры для вывода точно такие же?

Я использую Python 3.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Рассматривали ли вы использование инфраструктуры тестирования, такой как XSpec, которая уже решает эту проблему?

Как правило, два классических способа решения этой проблемы - это сравнение сериализованного XML-лексического кода после его передачи через канонизатор или сравнениедревовидные представления с использованием функции, такой как XPath 2.0 deep-equal ().

Ни один из них не является идеальным ответом.Во-первых, вещи, которые канонизация XML считает значимыми или несущественными, могут не совпадать с вещами, которые вы считаете значимыми или несущественными;и то же самое относится к XPath deep-equal().Во-вторых, вы действительно хотите знать не только, являются ли файлы одинаковыми, но и где различия.

Saxon имеет расширенную версию deep-equal() под названием saxon:deep-equal(), предназначенную для решения этих проблем: требуетсянабор флагов, которые можно использовать для настройки сравнения, и он пытается сказать вам, где различия с точки зрения предупреждающих сообщений.Но и это не идеальное решение.

В тестовых наборах W3C для XSLT 3.0 и XQuery мы отошли от сравнения выводов тестов в формате XML до написания утверждений с ожидаемыми результатами в терминах выражений XPath.В тестах используются следующие утверждения:

  <result>
     <all-of>
        <assert>every $a in /out/* except /out/a4 
                satisfies $a/@actual = $a/@expected</assert>
        <assert>/out/a4/@actual = 'false'</assert>
     </all-of>
  </result> 
0 голосов
/ 29 сентября 2018

Это легко сделать с помощью minidom:

from unittest import TestCase

from defusedxml.minidom import parseString


class XmlTest(TestCase):
    def assertXmlEqual(self, got, want):
        return self.assertEqual(parseString(got).toxml(), parseString(want).toxml())
0 голосов
/ 27 сентября 2018

Вы заботитесь о заказе?ЕСЛИ НЕТ:

Преобразуйте их в словарь и запустите на них команду deepdiff!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...