Сравнение XML в модульном тесте в Python

В PIVOT есть JIRA, чтобы сделать это изначально, без огромного оператора CASE для каждого значения:

https://issues.apache.org/jira/browse/HIVE -3776

Прошу проголосовать за JIRA, чтобы она была реализована раньше. Как только в Hive SQL, Spark обычно не слишком сильно отстает, и в конечном итоге он будет реализован и в Spark.

33
задан Adam Endicott 26 November 2008 в 19:09
поделиться

5 ответов

Сначала нормализуйте 2 XML, затем можно сравнить их. Я использовал следующий lxml

obj1 = objectify.fromstring(expect)
expect = etree.tostring(obj1)
obj2 = objectify.fromstring(xml)
result = etree.tostring(obj2)
self.assertEquals(expect, result)
использования
14
ответ дан 27 November 2019 в 18:32
поделиться

Используйте xmldiff, инструмент Python, который выясняет различия между двумя подобными XML-файлами, тот же способ, которым разность делает это.

5
ответ дан 27 November 2019 в 18:32
поделиться

Если проблемой является действительно просто порядок пробела и атрибута, и у Вас нет никаких других конструкций, чем текст и элементы для волнения о, можно проанализировать строки с помощью стандартного синтаксического анализатора XML и сравнить узлы вручную. Вот пример с помощью minidom, но Вы могли записать то же в etree, симпатичном просто:

def isEqualXML(a, b):
    da, db= minidom.parseString(a), minidom.parseString(b)
    return isEqualElement(da.documentElement, db.documentElement)

def isEqualElement(a, b):
    if a.tagName!=b.tagName:
        return False
    if sorted(a.attributes.items())!=sorted(b.attributes.items()):
        return False
    if len(a.childNodes)!=len(b.childNodes):
        return False
    for ac, bc in zip(a.childNodes, b.childNodes):
        if ac.nodeType!=bc.nodeType:
            return False
        if ac.nodeType==ac.TEXT_NODE and ac.data!=bc.data:
            return False
        if ac.nodeType==ac.ELEMENT_NODE and not isEqualElement(ac, bc):
            return False
    return True

при необходимости в более полном эквивалентном сравнении, покрывая возможности других типов узлов включая CDATA, ПИ, ссылки на сущность, комментарии, doctypes, пространства имен и так далее, Вы могли использовать метод Ядра Уровня 3 DOM isEqualNode. Ни minidom, ни etree не имеют это, но pxdom является одной реализацией, которая поддерживает его:

def isEqualXML(a, b):
    da, db= pxdom.parseString(a), pxdom.parseString(a)
    return da.isEqualNode(db)

(Можно хотеть изменить некоторые опции DOMConfiguration на синтаксическом анализе, если необходимо указать, соответствуют ли ссылки на сущность и разделы CDATA своим замененным эквивалентам.)

А немного больше окольного способа сделать его состояло бы в том, чтобы проанализировать, затем повторно сериализировать к канонической форме и сделать сравнение строк. Снова pxdom поддерживает опцию DOM Level 3 LS ‘canonical-form’, который Вы могли использовать, чтобы сделать это; альтернативный способ использовать minidom реализацию stdlib состоит в том, чтобы использовать c14n. Однако у Вас должна быть установка расширений PyXML для этого так, Вы все еще не можете вполне сделать этого в stdlib:

from xml.dom.ext import c14n

def isEqualXML(a, b):
    da, bd= minidom.parseString(a), minidom.parseString(b)
    a, b= c14n.Canonicalize(da), c14n.Canonicalize(db)
    return a==b
7
ответ дан 27 November 2019 в 18:32
поделиться

Почему Вы исследуете данные XML вообще?

способ протестировать сериализацию объекта состоит в том, чтобы создать экземпляр объекта, сериализировать его, десериализовать его в новый объект и сравнить два объекта. При внесении изменения, которое повреждает сериализацию или десериализацию, этот тест перестанет работать.

единственное дело, проверяющее данные XML, идет найти для Вас, то, если Ваш сериализатор испускает надмножество того, чего требует deserializer, и deserializer тихо игнорирует материал, который это не ожидает.

, Конечно, если что-то еще будет потреблением сериализированных данных, это - другой вопрос. Но в этом случае, необходимо думать об установлении схемы для XML и проверки его.

2
ответ дан 27 November 2019 в 18:32
поделиться

Компонент Java dbUnit делает много сравнений XML, таким образом, Вы могли бы найти полезным посмотреть на их подход (особенно для нахождения любых глюков, к которым они, возможно, уже обратились).

0
ответ дан 27 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: