Hướng dẫn how to compare two xml files in python - cách so sánh hai tệp xml trong python

Nếu ý định của bạn là so sánh nội dung và thuộc tính XML, và không chỉ so sánh các tệp byte-byte, thì có sự tinh tế cho câu hỏi, vì vậy không có giải pháp nào phù hợp với tất cả các trường hợp.

Bạn phải biết điều gì đó về những gì quan trọng trong các tệp XML.

Thứ tự của các thuộc tính được liệt kê trong một thẻ phần tử thường không được phép quan trọng. Đó là, hai tệp XML chỉ khác nhau theo thứ tự của các thuộc tính phần tử thường phải được đánh giá giống nhau.

Nhưng đó là phần chung.

Phần khó khăn phụ thuộc vào ứng dụng. Chẳng hạn, có thể là định dạng không gian trắng của một số yếu tố của tệp không quan trọng và không gian trắng có thể được thêm vào XML cho tính dễ đọc. Và như thế.

Các phiên bản gần đây của mô -đun ElementTree có hàm canonicalize(), có thể chăm sóc các trường hợp đơn giản hơn, bằng cách đặt chuỗi XML vào định dạng chính tắc.

Tôi đã sử dụng chức năng này trong các thử nghiệm đơn vị của một dự án gần đây, để so sánh đầu ra XML đã biết với đầu ra từ gói đôi khi thay đổi thứ tự của các thuộc tính. Trong trường hợp này, không gian trắng trong các yếu tố văn bản là không quan trọng, nhưng đôi khi nó được sử dụng để định dạng.

import xml.etree.ElementTree as ET
def _canonicalize_XML( xml_str ):
    """ Canonicalizes XML strings, so they are safe to 
        compare directly. 
        Strips white space from text content."""

    if not hasattr( ET, "canonicalize" ):
        raise Exception( "ElementTree missing canonicalize()" )

    root = ET.fromstring( xml_str )
    rootstr = ET.tostring( root )
    return ET.canonicalize( rootstr, strip_text=True )

Để sử dụng nó, một cái gì đó như thế này:

file1 = ET.parse('file1.xml')
file2 = ET.parse('file2.xml')

canon1 = _canonicalize_XML( ET.tostring( file1.getroot() ) )
canon2 = _canonicalize_XML( ET.tostring( file2.getroot() ) )

print( canon1 == canon2 )

Trong phân phối của tôi, Python 2 không có canonicalize(), nhưng Python 3 thì có.

Hướng dẫn how to compare two xml files in python - cách so sánh hai tệp xml trong python

XMLDIFF là một thư viện và tiện ích dòng lệnh để tạo ra các phân biệt từ XML. Điều này có vẻ giống như một cái gì đó không cần một tiện ích chuyên dụng, nhưng phát hiện thay đổi trong dữ liệu phân cấp rất khác với phát hiện thay đổi trong dữ liệu phẳng. Các định dạng loại XML cũng không chỉ được sử dụng cho dữ liệu có thể đọc được máy tính, nó còn thường được sử dụng làm định dạng cho dữ liệu phân cấp có thể được kết xuất thành các định dạng có thể đọc được của con người. Một sự khác biệt truyền thống trên một định dạng như vậy sẽ cho bạn biết từng dòng khác biệt, nhưng điều này sẽ không thể đọc được bởi một con người. XMLDIFF cung cấp các công cụ để làm cho sự khác biệt có thể đọc được của con người trong những tình huống đó. is a library and a command-line utility for making diffs out of XML. This may seem like something that doesn’t need a dedicated utility, but change detection in hierarchical data is very different from change detection in flat data. XML type formats are also not only used for computer readable data, it is also often used as a format for hierarchical data that can be rendered into human readable formats. A traditional diff on such a format would tell you line by line the differences, but this would not be be readable by a human. xmldiff provides tools to make human readable diffs in those situations.

Tài liệu đầy đủ là trên xmldiff.readthedocs.io

XMLDIFF vẫn đang được phát triển nhanh chóng và không có gì đảm bảo được thực hiện rằng đầu ra của một phiên bản sẽ giống như đầu ra của bất kỳ phiên bản trước nào. is still under rapid development, and no guarantees are done that the output of one version will be the same as the output of any previous version.

Sử dụng nhanh chóng

XMLDIFF vừa là một công cụ dòng lệnh vừa là thư viện Python. Để sử dụng nó từ dòng lệnh, chỉ cần chạy xmldiff với hai tệp đầu vào: is both a command-line tool and a Python library. To use it from the command-line, just run xmldiff with two input files:

$ xmldiff file1.xml file2.xml

Ngoài ra còn có một lệnh để vá một tệp với đầu ra từ lệnh xmldiff:xmldiff command:

$ xmlpatch file.diff file1.xml

Có một API đơn giản để sử dụng xmldiff làm thư viện:xmldiff as a library:

from lxml import etree
from xmldiff import main, formatting

diff = main.diff_files('file1.xml', 'file2.xml',
                       formatter=formatting.XMLFormatter())

Ngoài ra còn có một phương thức diff_trees () lấy hai cây lxml và một phương thức diff_texts () sẽ lấy các chuỗi chứa XML. Tương tự, có pagp_file () patpdiff_trees() that take two lxml trees, and a method diff_texts() that will take strings containing XML. Similarly, there is patch_file() patch_text() and patch_tree():

result = main.patch_file('file.diff', 'file1.xml')

Thay đổi từ XMLDIFF 0,6/1.xxmldiff 0.6/1.x

  • Một bản viết lại hoàn chỉnh, lên, Python Python thuần túy

  • Dễ dàng hơn để duy trì, mã ít phức tạp hơn và pythonic hơn, và sử dụng nhiều lớp tùy chỉnh hơn thay vì chỉ là danh sách làm tổ và dicts.

  • Khắc phục các vấn đề với một số tệp lớn nhất định và giải quyết rò rỉ bộ nhớ.

  • Một API Python đẹp, dễ sử dụng để sử dụng nó làm thư viện.

  • Thêm hỗ trợ cho việc hiển thị các khác nhau ở các định dạng khác nhau, chủ yếu là một trong đó sự khác biệt được đánh dấu trong XML, hữu ích cho việc tạo ra sự khác biệt có thể đọc được của con người.

    Các định dạng này có thể hiển thị sự khác biệt văn bản một cách có ý nghĩa về mặt ngữ nghĩa.

  • Định dạng đầu ra tương thích với 0,6/1.x cũng có sẵn.

  • 2.0 hiện chậm hơn đáng kể so với XMLDIFF 0,6/1.x, nhưng điều này sẽ thay đổi trong tương lai. Hiện tại chúng tôi không nỗ lực để làm cho Xmldiff 2.0 nhanh chóng, chúng tôi tập trung vào việc làm cho nó chính xác và có thể sử dụng được.xmldiff 0.6/1.x, but this will change in the future. Currently we make no effort to make xmldiff 2.0 fast, we concentrate on making it correct and usable.

Người đóng góp

  • Lennart Regebro, regebro@gmail (tác giả chính)@gmail.com (main author)

  • Stephan Richter, [email protected]@shoobx.com

  • Albertas Agejevas, [email protected]@shoobx.com

Thuật toán Diff dựa trên phát hiện thay đổi của người dùng trong thông tin có cấu trúc phân cấp, và văn bản Diff đang sử dụng thuật toán Google Lừa DIFT_MATCH_PATCH.diff_match_patch algorithm.

Thay đổi

2.4 (2019-10-09)

  • Đã thêm một tùy chọn để vượt qua các cặp (phần tử, attr) dưới dạng các thuộc tính duy nhất để khớp cây. Phơi bày tùy chọn này trên dòng lệnh, quá.

2.3 (2019-02-27)

  • Đã thêm một lệnh XMLPatch đơn giản và API.xmlpatch command and API.

  • Nhiều bản cập nhật cho tài liệu và kiểu mã

2.2 (2018-10-12)

  • Một cách giải quyết để đối phó với các bình luận cấp cao nhất và định dạng XML

2.1 (2018-10-03)

  • Đã thay đổi khu vực ký tự Unicode thay thế để sử dụng khu vực sử dụng riêng trong BMP (0), để hỗ trợ các bản dựng Python hẹp

  • Đã thêm đối số của người thuộc tính.

2.1B1 (2018-10-01)

  • Đã thêm các tùy chọn để so sánh nút nhanh hơn. Tùy chọn Middle giữa hiện tại là mặc định, nó có rất ít thay đổi trong các trận đấu, nhưng nhanh hơn nhiều.

  • Đã thực hiện một thuật toán phù hợp nhanh cho sự khác biệt nhanh hơn.

  • Cải thiện tốc độ thông qua bộ nhớ đệm

  • Đã sửa lỗi trong đó các hành động Movenode đôi khi theo thứ tự sai

  • Đã thêm một hành động chèn vào, vì các bình luận yêu cầu xử lý khác nhau, vì vậy nó dễ dàng hơn để đối phó với chúng theo cách này. Bạn vẫn có thể sử dụng Deletenode và UpdatetEtextin cho họ mà không có xử lý đặc biệt.

  • Khi đổi tên thẻ, xmlformatter sẽ đánh dấu chúng bằng cách khác nhau: đổi tên thay vì tạo một thẻ mới và xóa cái cũ.

  • Các thẻ bây giờ sẽ được di chuyển trước, và được cập nhật và đổi tên sau, vì tên thẻ hoặc thuộc tính mới có thể không hợp lệ ở vị trí cũ.

2.0 (2018-09-25)

  • Một bản viết lại hoàn chỉnh, từ dưới lên, Python Python

  • API dễ dàng mới

  • Bảo hiểm thử nghiệm 100%

  • Định dạng đầu ra mới:

    • Định dạng đầu ra mặc định mới với các hành động mới

    • Một định dạng dự định có thể phân tích được bởi bất kỳ ai phân tích định dạng cũ.

    • XML với các thay đổi được đánh dấu mặc dù các thẻ và thuộc tính

  • XMLDIFF 2.0 chậm hơn đáng kể so với XMLDIFF 0,6 hoặc 1,0, sự nhấn mạnh cho đến nay là về tính chính xác, không phải tốc độ.

Làm cách nào để so sánh hai tệp XML?

Sao chép và dán, kéo và thả tệp XML hoặc nhập trực tiếp vào các trình chỉnh sửa ở trên, sau đó nhấp vào nút "So sánh", chúng sẽ được so sánh nếu hai XML có hiệu lực.Bạn cũng có thể nhấp vào nút "Tải XML từ URL" để tải dữ liệu XML của bạn từ URL (phải là HTTPS). they will be compared if the two XML are valids. You can also click on "load XML from URL" button to load your XML data from a URL (Must be https).

Làm cách nào để xem các tệp XML trong Python?

Để đọc một tệp XML bằng ElementTree, trước tiên, chúng tôi nhập lớp ElementTree được tìm thấy bên trong thư viện XML, dưới tên ET (thông tin chung).Sau đó chuyển tên tệp của tệp XML cho ElementTree.Phương thức Parse (), để cho phép phân tích tệp XML của chúng tôi.Sau đó, nhận được gốc (thẻ cha) của tệp XML của chúng tôi bằng GetRoot ().

Làm cách nào để so sánh hai tệp XML trong Visual Studio?

Từ bảng điều khiển Explorer bên trái, nhấp chuột phải vào tệp thứ nhất và chọn chọn để so sánh từ menu nhấp chuột phải. Sau đó bấm chuột phải vào tệp thứ hai và chọn So sánh với đã chọn.Cả hai tệp sẽ được mở trong bảng điều khiển chính, cạnh nhau trong chế độ Chế độ xem nội tuyến, thoải mái khi so sánh sự khác biệt. Then right-click the second file and choose Compare with Selected. Both the files will be opened in the main panel, side by side in inline view mode which is comfortable for comparing the differences.