2011-11-28 31 views
6

Tôi muốn so sánh 2 lược đồ XSD A và B để xác định rằng tất cả tài liệu ví dụ hợp lệ cho lược đồ A cũng sẽ hợp lệ với lược đồ B. Tôi hy vọng sử dụng điều này để chứng minh mặc dù lược đồ A và B là "khác", chúng có hiệu quả giống nhau. Ví dụ về sự khác biệt này sẽ không kích hoạt sẽ được Schema A sử dụng các loại và Schema B tuyên bố tất cả các yếu tố nội tuyến của nó.Làm thế nào để so sánh 2 tệp lược đồ xsd cho hàm tương đương

Tôi đã tìm thấy rất nhiều người nói về các công cụ loại khác "thông minh" nhưng chúng sẽ yêu cầu hai tệp khác nhau vì chúng có văn bản khác nhau nhưng cấu trúc kết quả giống nhau. Tôi tìm thấy một số tài liệu tham khảo để XSOM nhưng tôi không chắc chắn nếu điều đó sẽ giúp đỡ hay không.

Bất kỳ suy nghĩ nào về cách tiếp tục?

Trả lời

3

Cách tiếp cận của tôi với điều này là để chuẩn hóa biểu diễn của Lược đồ XML. Thật không may, tôi cũng có thể nói với bạn rằng, không giống như canonicalization các tài liệu XML (được sử dụng, ví dụ, để tính chữ ký số), nó không phải là đơn giản hoặc thậm chí tiêu chuẩn hóa. Vì vậy, về cơ bản, bạn phải chuyển đổi cả hai lược đồ XML thành một "dạng thức kinh điển" - bất cứ công cụ nào bạn xây dựng hoặc sử dụng nghĩ rằng biểu mẫu là, và sau đó thực hiện so sánh. Cách tiếp cận của tôi là tạo một bộ lược đồ XML (có thể có nhiều hơn một tệp nếu bạn có nhiều không gian tên) cho mỗi phần tử gốc mà tôi cần, vì tôi thấy dễ dàng hơn khi so sánh các XSD được tạo ra bằng cách sử dụng kiểu búp bê Nga, bắt đầu từ mô hình PSVI.

Sau đó tôi đã sử dụng các tùy chọn như thành viên nhóm thay thế đối sánh tự động kết hợp với thay thế các nhóm thay thế bằng lựa chọn; loại bỏ các chuỗi lược đồ XML "thừa", thu gọn các lựa chọn tùy chọn đơn lẻ hoặc di chuyển minOccurs/maxOccurs xung quanh cho các trình tạo mục đơn lẻ, v.v.

Tùy thuộc vào tính năng của công cụ so sánh XSD, hoặc bạn giải quyết để xây dựng, cũng có thể phải sắp xếp lại các hạt dưới các trình biên dịch như xsd: choice hoặc xsd: all; Bất cứ điều gì, những gì tôi học được sau khi tất cả nó là rất khó để xây dựng một công cụ mà sẽ làm việc tốt đẹp cho tất cả các tính năng "XSD" mát mẻ ra khỏi đó ... Một trường hợp thử nghiệm tôi nhớ trìu mến là để đối phó với xsd khác nhau: bất kỳ nội dung nào.

Tôi tự hỏi mặc dù nếu mọi thứ đã thay đổi kể từ ...

+0

Darn Tôi đã hy vọng rằng có một số cách "đơn giản" mà tôi đã bỏ lỡ. Các bài mà tôi không thể tìm thấy và bị mắc kẹt trong đầu của tôi là dọc theo dòng XSOM là canonicalization của XSD mà sau đó sẽ có thể được so sánh. Công cụ so sánh nhận thức XSD nào bạn đang sử dụng? –

+0

XSOM không phải là một canonicalization của XSD, chắc chắn; có lẽ họ đang đề cập đến "xem" PSVI mà XSOM biên dịch cho bạn. Nhưng điều đó chỉ có thể được sử dụng cho một số trường hợp rất cơ bản. Bạn sẽ vẫn phải áp dụng các biến đổi tùy chỉnh của mình để tạo các XSD mới nếu bạn muốn các công cụ bên ngoài thực hiện so sánh cho bạn.Tôi không biết (hoặc đã học được điều đó) của bất kỳ XSOM nào sẽ sắp xếp lại khung nhìn PSVI trở lại thành một tệp XSD ... Tôi đã tự mình viết một công cụ toàn bộ, và cuối cùng đã gắn nó là một Tái cấu trúc Lược đồ XML; chuyển đổi sang một con búp bê Nga không tồn tại phiên bản 1.0 mặc dù ... –

4

Membrane SOA Model - Java API for WSDL and XML Schema

package sample.schema; 

import java.util.List; 
import com.predic8.schema.Schema; 
import com.predic8.schema.SchemaParser; 
import com.predic8.schema.diff.SchemaDiffGenerator; 
import com.predic8.soamodel.Difference; 

public class CompareSchema { 

    public static void main(String[] args) { 
    compare(); 
    } 

    private static void compare(){ 
    SchemaParser parser = new SchemaParser(); 

    Schema schema1 = parser.parse("resources/diff/1/common.xsd"); 

    Schema schema2 = parser.parse("resources/diff/2/common.xsd"); 

    SchemaDiffGenerator diffGen = new SchemaDiffGenerator(schema1, schema2); 
    List<Difference> lst = diffGen.compare(); 
    for (Difference diff : lst) { 
     dumpDiff(diff, ""); 
    } 
    } 

    private static void dumpDiff(Difference diff, String level) { 
    System.out.println(level + diff.getDescription()); 
    for (Difference localDiff : diff.getDiffs()){ 
     dumpDiff(localDiff, level + " "); 
    } 
    } 
} 

After executing you get the output shown in listing 2. It is a List of differences between the two Schema documents.

ComplexType PersonType has changed: Sequence has changed: 
    Element id has changed: 
     The type of element id has changed from xsd:string to tns:IdentifierType. 

http://www.service-repository.com/ cung cấp một công cụ trực tuyến XML Schema Version Comparator hiển thị một báo cáo về sự khác nhau giữa hai XSD dường như được tạo ra từ Mô hình SOA Màng.

+0

Phiên bản có sẵn để tải xuống không hoạt động. Một trong các thư viện bên trong của chúng thiếu một tệp .class: Ngoại lệ trong chuỗi "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/BytecodeInterface8. LE: có vẻ như nó hoạt động nếu bạn tải xuống theo cách thủ công bản groovy 1.8.6 và thêm nó vào đường dẫn xây dựng. – Buffalo

+0

Hi..Tôi đã thử ví dụ của bạn nhưng nó không làm việc cho tôi.Tôi đang cố gắng so sánh hai tệp lược đồ, một tệp được cấu trúc đầy đủ và một là nội tuyến (lược đồ thực tế được nhập bằng cách sử dụng nhập). Bạn có thể giúp tôi không ? –

+0

Cảm ơn bạn. Đây là những gì tôi đã bị mắc kẹt trong một thời gian. Bất kỳ ý tưởng nào có thể lọc sự khác biệt và chỉ hiển thị các khác biệt về phần tử bị xóa? – mattymanme

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