2012-04-25 40 views
5

Tôi có tệp xml nói abc.xml & 123.xml gần như giống nhau, ý tôi là có cùng nội dung, nhưng ví dụ thứ hai, 123.xml có nhiều nội dung hơn so với tệp trước đó . Tôi muốn đọc cả hai tệp bằng cách sử dụng Java và so sánh xem nội dung có trong abc.xml cho mỗi thẻ có giống như trong tệp 123.xml hay không, giống như đối tượng so sánh. Hãy gợi ý cho tôi cách đọc tệp xml bằng cách sử dụng java và bắt đầu so sánh.So sánh hai tệp xml sử dụng JAVA

Cảm ơn.

+2

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. –

+0

Đ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? –

+0

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. –

Trả lời

5

tôi sẽ đi cho XMLUnit. Các tính năng nó cung cấp:

  • sự khác biệt giữa hai phần của XML
  • Kết quả của việc chuyển đổi một mảnh XML sử dụng XSLT
  • Việc đánh giá một biểu thức XPath trên một mảnh của XML
  • Các hiệu lực của một mảnh XML
  • nút riêng lẻ trong một mảnh của XML được tiếp xúc bởi DOM Traversal

Chúc may mắn!

1

Vâng, nếu bạn chỉ muốn so sánh và hiển thị thì bạn có thể sử dụng Guiffy

Nó là một công cụ tốt. Nếu bạn muốn thực hiện việc xử lý trong chương trình phụ trợ thì bạn phải sử dụng trình phân tích cú pháp DOM tải cả hai tệp vào 2 đối tượng DOM và so sánh thuộc tính theo thuộc tính.

4

Tôi sẽ sử dụng JAXB để tạo các đối tượng Java từ các tệp XML và sau đó so sánh các tệp Java. Họ sẽ làm cho việc xử lý dễ dàng hơn nhiều.

12

nếu bạn chỉ muốn so sánh sau đó sử dụng này:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setCoalescing(true); 
dbf.setIgnoringElementContentWhitespace(true); 
dbf.setIgnoringComments(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 

Document doc1 = db.parse(new File("file1.xml")); 
doc1.normalizeDocument(); 

Document doc2 = db.parse(new File("file2.xml")); 

doc2.normalizeDocument(); 
Assert.assertTrue(doc1.isEqualNode(doc2)); 

khác thấy điều này http://xmlunit.sourceforge.net/

+0

Điều này có thể được sử dụng nếu một trong các tài liệu xml có đủ điều kiện với không gian tên nhưng không phải là không? – ziggy

0

đó là một chút quá mức cần thiết, nhưng nếu XML của bạn có lược đồ, bạn có thể chuyển đổi nó thành EMF metamodel & sau đó sử dụng EMF So sánh để so sánh.

3

Nói chung, nếu bạn biết rằng bạn có hai tệp có cấu trúc giống nhau nhưng nội dung hơi khác và không theo thứ tự bạn sẽ phải "đọc" các tệp để so sánh nội dung.

Nếu bạn có lược đồ XML cho tệp XML của mình thì bạn có thể sử dụng JAXB để tạo một tập hợp các lớp đại diện cho DOM cụ thể được xác định bởi lược đồ XML của bạn. Lợi ích của phương pháp này là bạn sẽ không phải phân tích cú pháp tệp XML thông qua các hàm chung cho các phần tử và thuộc tính mà là thông qua các trường thực tế có ý nghĩa với vấn đề của bạn.

Tất nhiên, để có thể phát hiện sự hiện diện của cùng một mục nhập trên cả hai tệp, bạn sẽ phải "đối sánh" chúng thông qua một số trường phổ biến (ví dụ: một số ID).

Để giúp bạn với các bản sao quá trình khám phá bạn có thể sử dụng một số cấu trúc có liên quan dữ liệu từ bộ sưu tập của Java, giống như Set (hoặc một trong các dẫn xuất của nó)

Tôi hy vọng điều này sẽ giúp.

1

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ã.