2009-01-09 31 views
11

Tôi nghĩ rằng tôi có một vấn đề khá độc đáo để giải quyết. Vâng, tôi không thể tìm đủ thông tin bằng Google. Vì vậy, ở đây nó đi,XML Diff and Merge

Tôi làm việc trên một ứng dụng Java EE SOA lưu trữ các tài liệu XML dưới dạng XML bằng cách sử dụng Oracle XML DB. Bất cứ khi nào XML thay đổi, tôi tăng phiên bản và ném phiên bản trước đó vào một bảng khác.

Yêu cầu bây giờ là, tôi nên lưu trữ sự khác biệt giữa 2 phiên bản dưới dạng XML, thay vì toàn bộ tài liệu XML.

  1. Có thư viện Java nào có thể so sánh XML không? (XMLUnit, ...?)
  2. Có lược đồ XML tiêu chuẩn nào để ghi lại sự khác biệt về XML không?
  3. Tôi có thể sử dụng công nghệ chuyển đổi nào để áp dụng "sự khác biệt" cho XML để chuyển qua lại giữa các phiên bản? (XSLT, Groovy, ....?)

Tôi đánh giá cao thời gian của bạn.

+1

Về một định dạng chuẩn, có bạn thấy [RFC 5261] (https://tools.ietf.org/html/rfc5261)? - Dường như nó có trước câu hỏi của bạn một chút - muộn hơn không bao giờ. – BrainSlugs83

Trả lời

4

Có bất kỳ số lượng công cụ tìm khác biệt XML nguồn mở nào được viết bằng Java mà bạn có thể sử dụng. Một danh sách các công cụ như vậy là here.

9

Trong công việc cuối cùng của mình, chúng tôi có một vấn đề tương tự: Chúng tôi phải phát hiện các thay đổi, chèn và xóa các mục cụ thể giữa hai tệp XML. Các tệp không phải là XML tùy ý; họ phải tuân theo XSD của chúng tôi.

Giải pháp của chúng tôi là triển khai một loại sắp xếp hợp nhất: Phân tích cú pháp các tệp (sử dụng trình phân tích cú pháp SAX, không phải trình phân tích cú pháp DOM, để cho phép các tệp lớn tùy ý) và lưu trữ dữ liệu được phân tích cú pháp trong HashMaps riêng biệt. Sau đó, chúng tôi so sánh nội dung của hai bản đồ bằng một loại thuật toán sắp xếp hợp nhất.

Đương nhiên, các tệp càng lớn thì áp lực bộ nhớ càng lớn, vì vậy cuối cùng tôi đã viết một lớp FileHashMap đẩy không gian giá trị HashMap vào các tệp truy cập ngẫu nhiên. Trong khi về mặt lý thuyết chậm hơn, giải pháp này cho phép so sánh của chúng tôi để làm việc với các tệp rất lớn, mà không có điều kiện ném hoặc OutOfMemoryError. (Một phiên bản của lớp FileHashMap đó có sẵn trong thư viện này: http://www.clapper.org/software/java/util/)

Tôi không biết liệu những gì tôi vừa mô tả thậm chí còn gần với những gì bạn cần, nhưng tôi nghĩ tôi sẽ chia sẻ nó.

Chúc may mắn.

8

Lưu ý phụ: hiện có định dạng chuẩn cho "bản vá lỗi" XML, trong RFC 5261. Có ít nhất một chương trình phần mềm miễn phí, xmlpatch, thực hiện nó. Nó được viết bằng C, bạn có thể gọi nó từ Java.

+0

Hmm, có vẻ như liên kết bạn cung cấp là libxmlpatch, đây là thư viện C++. Công cụ dòng lệnh (và cửa sổ nhị phân) ở đâu? – BrainSlugs83

1

Hãy thử sử dụng Pretty Diff. Nó được thiết kế để làm việc với một số phần mở rộng khác nhau dựa trên cú pháp XML cơ bản.

http://prettydiff.com/