Phương pháp phù hợp phụ thuộc vào hai yếu tố:
(a) bạn muốn kiểm soát bao nhiêu so với cách thực hiện so sánh? Ví dụ, bạn có cần phải kiểm soát xem khoảng trắng có quan trọng hay không, có nên bỏ qua các chú thích hay không, cho dù bỏ qua các tiền tố vùng tên, có nên bỏ qua các khai báo không gian tên dư thừa hay không, liệu khai báo XML có bị bỏ qua không?
(b) bạn muốn câu trả lời nào? (i) một boolean: cùng/khác nhau, (ii) một danh sách các sự khác biệt phù hợp với một con người để xử lý, (iii) một danh sách các sự khác biệt phù hợp cho một ứng dụng để xử lý.
Hai kỹ thuật tôi sử dụng là: (a) chuyển đổi cả hai tệp thành XML chuẩn và sau đó so sánh các chuỗi. Điều này cho phép kiểm soát rất ít và chỉ cho kết quả boolean. (b) so sánh hai cây bằng cách sử dụng hàm XPath 2.0 (hoặc) với saxon phiên bản Saxon mở rộng: deep-equal(). Phiên bản Saxon cho phép kiểm soát nhiều hơn về cách so sánh được thực hiện, và một báo cáo chi tiết hơn về sự khác biệt được tìm thấy (để đọc của con người, không phải để sử dụng ứng dụng).
Nếu bạn muốn viết mã Java, bạn có thể thực hiện logic so sánh của riêng bạn - ví dụ bạn có thể tìm thấy việc thực thi mã nguồn mở XPath bằng nhau và sửa đổi nó để đáp ứng yêu cầu của bạn. Chỉ có một trăm dòng mã.
Nguồn
2012-04-25 08:38:12
Trong trường hợp của bạn, tôi có thể đề xuất trình phân tích cú pháp DOM (với điều kiện tệp của bạn không lớn). Sau đó, bạn có hiệu quả sẽ có đối tượng của bạn và có thể so sánh chúng theo từng lĩnh vực. –
Điều gì sẽ xảy ra nếu có hai nút có cùng một thẻ? Làm cách nào để họ so sánh? –
Thực ra tất cả nội dung của abc.xml đều có trong 123.xml. Tôi chỉ muốn kiểm tra xem các phần tử có thẻ trong abc.xml có trong tệp 123.xml hay không. –