2009-11-30 34 views
5

Tôi muốn kiểm soát thứ tự thuộc tính trong các tệp .java được trình biên dịch JAXB tạo ra.Trình biên dịch JAXB và thứ tự thuộc tính

Tôi biết rằng thứ tự thuộc tính không quan trọng đối với xác thực xml. Trình tự này quan trọng đối với việc so sánh văn bản của xml được trộn lẫn trong một môi trường thử nghiệm hồi quy. Thứ tự các thuộc tính trong một tệp ảnh hưởng trực tiếp đến thứ tự của các thuộc tính trong các thẻ xml được sắp xếp lại.

Mỗi khi trình biên dịch JAXB chạy các nhóm thuộc tính xuất hiện theo một thứ tự khác, ngay cả khi không có thay đổi đối với lược đồ. Không có tùy chọn rõ ràng có sẵn trên trình biên dịch để ngăn chặn hành vi này.

Tôi muốn tránh chạy tập lệnh sau khi biên dịch để sắp xếp thứ tự các thuộc tính trong tệp .java được tạo ra theo thứ tự bảng chữ cái vì điều này chia nhỏ các nhóm thuộc tính, nhưng tôi không chắc chắn có một tùy chọn khác.

Bất kỳ đề xuất nào được đánh giá cao.

Cảm ơn, Dave

Trả lời

0

Chuỗi này cung cấp giải pháp tuyệt vời cho vấn đề của tôi.

Using XSL to sort attributes

Một trong những câu trả lời có chứa một xsl chuyển đổi mà chỉ sắp xếp lại các thuộc tính. Hoạt động hoàn hảo nếu chậm một chút.

1

tôi khuyên bạn nên sử dụng một phân tích cú pháp XML để xác nhận sản lượng thay vì làm so sánh văn bản. Nếu bạn định phân tích cú pháp xml để sắp xếp lại nó, bạn cũng có thể thực hiện so sánh bằng cách sử dụng các công cụ XML.

Chỉnh sửa: Cố gắng kiểm soát XML được tạo bằng cách thao tác thứ tự mã nguồn Java có vẻ như một cách dễ dàng để làm việc. Cấp, đây là để thử nghiệm chỉ, vì vậy nếu một cái gì đó phá vỡ mã có thể vẫn hoạt động đúng. Mọi người thay đổi thứ tự mã nguồn tất cả các thời gian, đôi khi do tai nạn, và nó sẽ gây phiền nhiễu hoặc một nguồn tinh tế của các vấn đề nếu bạn phải dựa vào một thứ tự nhất định.

Đối với các cách so sánh dữ liệu XML bằng các công cụ XML, tôi chưa bao giờ cá nhân thực hiện điều này trên quy mô lớn, nhưng this link mentions a few free tools. Đối với tôi, phần mở rộng cho JUnit cung cấp các xác nhận liên quan đến XML sẽ là bước đầu tiên của tôi, vì nó có thể tích hợp tốt với các thử nghiệm hiện có của tôi. Nếu không, vì bạn chủ yếu tìm kiếm sự tương đương chính xác, bạn có thể phân tích cú pháp hai tệp XML, sau đó lặp lại các nút trong tệp 'mong đợi' và xem liệu các nút đó có xuất hiện trong tệp 'thực tế' hay không. Sau đó, chỉ cần kiểm tra các nút khác mà bạn không mong đợi để xem.

+0

Việc so sánh là một phần của một bash script điều khiển kiểm tra hồi quy lớn và chúng tôi hiện không phân tích bất kỳ phản hồi xml. Tôi có thể sử dụng một công cụ khác biệt XML nhưng tôi không có bất kỳ kinh nghiệm với họ. Tôi đang làm việc trong một môi trường Solaris - bạn có thể đề xuất một công cụ khác biệt xml có thể được gọi từ dòng lệnh cho mục đích này? Ngoài ra các tệp cần so sánh có thể không xác thực đối với giản đồ vì một số khác biệt đã biết được thay thế bằng các giá trị không đổi. – daveg

+0

Ngoài ra, tôi đã xem xét sắp xếp lại các thuộc tính trong tệp .java - không phải là phản hồi xml. Tôi đoán marshaller sử dụng sự phản chiếu bởi vì thứ tự trong tập tin .java dường như điều khiển trực tiếp thứ tự thuộc tính trong các đáp ứng marshalled. – daveg

+0

Tôi đã chỉnh sửa câu trả lời của mình để giải quyết hai điểm của bạn. –

1

Nếu bạn cần thực hiện so sánh văn bản các tài liệu XML, có những cách tốt hơn để làm điều đó hơn là cố gắng kiểm soát đầu ra của một khung công tác XML không phân biệt giữa thứ tự thuộc tính.

Ví dụ: có XMLUnit, là tiện ích mở rộng junit dành riêng cho xác nhận XML và tiện ích này xử lý khoảng trắng và đặt hàng khá độc đáo.

Giải pháp tổng quát hơn là XOM'sCanonicalizer, kết quả đầu ra các DOM XML sao cho có thể dự đoán được thứ tự thuộc tính và khoảng trắng thuộc tính. Rất tiện dụng.

Vì vậy, hãy để JAXB (hoặc bất kỳ) tạo XML khi nó phù hợp, sau đó chạy kết quả đầu ra thông qua XMLUnit hoặc XOM và so sánh. Điều này có lợi thế nhất là không phụ thuộc vào JAXB, nó sẽ làm việc với bất kỳ XML được tạo ra nào.

4

Rõ ràng, trong JAXB 2.0, bạn có thể sử dụng @XmlAccessorOrder chú thích hoặc @XmlType (propOrder =)

Các vấn đề liên quan