сравнить XML-файлы с помощью Python - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу сравнить эти два xml-файла:

File1.xml:

<ngs_sample id="40332">
  <workflow value="salmonella" version="101_provisional" />
  <results>
  <gastro_prelim_st reason="not novel" success="false">
      <type st="1364" />
      <type st="9999" />
  </gastro_prelim_st>
 </results>
</ngs_sample>

File2.xml:

<ngs_sample id="40332">
  <workflow value="salmonella" version="101_provisional" />
  <results>
  <gastro_prelim_st reason="not novel" success="false">
      <type st="1364" />
   </gastro_prelim_st>
 </results>
</ngs_sample>

Я использовал xmldiff сравнить a.xml с b.xml:

def compare_xmls(observed,expected):

    from xmldiff import main, formatting
    formatter = formatting.DiffFormatter()
    diff = main.diff_files(observed,expected,formatter=formatter)
    return diff

out = compare_xmls(a.xml, b.xml)
print(out)

ВЫХОД:

[delete, /ngs_sample/results/gastro_prelim_st/type[2]]

Кто-нибудь знает, как определить разницу между двумя файлами XML, то есть то, что былоудален по сравнению с файлом b.xml.Кто-нибудь порекомендует любой другой способ сравнения XML-файлов в Python?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете переключиться на XMLFormatter и вручную отфильтровать результаты:

...
# Change formatter:
formatter = formatting.XMLFormatter(normalize=formatting.WS_BOTH)

...

# after `out` has been retrieved:
import re
for i in out.splitlines():
  if re.search(r'\bdiff:\w+', i):
    print(i)

# Result:
#       <type st="9999" diff:delete=""/>
0 голосов
/ 07 января 2019

Попробуйте XmlXdiff , в настоящее время доступен только вывод SVG.Но это должно быть довольно просто при условии вывода текста или класса интерфейса.

Пример кода с веб-сайта XmlXDiff:

from XmlXdiff.XReport import DrawXmlDiff

_xml1 = """<root><deleted>with content</deleted><unchanged/><changed name="test1" /></root>"""
_xml2 = """<root><unchanged/><changed name="test2" /><added/></root>"""

with open("test1.xml", "w") as f:
    f.write(_xml1)

with open("test2.xml", "w") as f:
    f.write(_xml2)

x = DrawXmlDiff("test1.xml", "test2.xml")
x.saveSvg('xdiff.svg')

Пример вывода

0 голосов
/ 22 ноября 2018

Используйте xmldiff для выполнения этой точной задачи.

main.py

from xmldiff import main
diff = main.diff_files("file1.xml", "file2.xml")
print(diff)

output

[DeleteNode(node='/ngs_sample/results/gastro_prelim_st/type[2]')]
...