2008-12-22 38 views
7

Tôi đang cố gắng để tạo ra một lược đồ XML khá đơn giản cho một XML tương tự như sau:XML schema nhập nhằng

<messages> 
    <item> 
    <important_tag></important_tag> 
    </item> 
    <item> 
    <important_tag></important_tag> 
    <tag2></tag2> 
    </item> 
    <item> 
    <tag2></tag2> 
    <tag3></tag3> 
    </item> 
</messages> 

Ý tưởng là <important_tag> sẽ có một định nghĩa cụ thể và nó có thể hoặc có thể không xuất hiện dưới <item>. Nó cũng có thể xuất hiện nhiều lần. Ngoài ra, có thể có các thẻ khác trước hoặc sau <important_tag> mà tôi không thể đặt tên trước.

Tôi muốn đưa ra định nghĩa cụ thể cho <important_tag>. Ví dụ, xác định các thuộc tính mà nó phải chứa. Ý của tôi là nếu important_tag hiện diện, nó phải phù hợp với định nghĩa của tôi. Bất kỳ thẻ nào khác không phải tuân theo bất kỳ định nghĩa nào.

tôi đã cố gắng sử dụng các sơ đồ sau:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="messages"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="item" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="item"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="important_tag" minOccurs="0"/> 
     <xs:any minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="important_tag"> 
    <xs:complexType> 
     <xs:simpleContent> 
     ... specific definitions for important_tag ... 
     </xs:simpleContent> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Điều này dẫn đến một lỗi nói rằng schema là mơ hồ.

Các thông báo lỗi chính xác là:

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups. 

Tôi đang sử dụng XML Spy Altova của.

Làm cách nào để giải quyết vấn đề này?

Cảm ơn, Dana

+0

Bạn có thể vui lòng đăng thông báo lỗi chính xác mà bạn đang nhận được và những công cụ bạn đã sử dụng không? – Tomalak

Trả lời

6

Về lỗi: đó là thông báo lỗi đề cập đến một dòng mà không có trong XSD bạn đã bao gồm, nhưng hai dòng sau trong nó là mơ hồ:

<xs:element ref="important_tag" minOccurs="0"/> 
<xs:any minOccurs="0"/> 

Ví dụ đơn giản nhất để hiển thị sự mơ hồ là nếu chỉ có một <important_tag>:

<important_tag></important_tag> 

vấn đề là nó có thể được hiểu như một "important_tag" và không "bất kỳ" thẻ (đó là những gì bạn muốn), nhưng nó cũng có thể được hiểu như là zero "important_tag" và một "bất kỳ" thẻ. Điều này là do thẻ "bất kỳ" có thể khớp với bất kỳ thẻ nào, bao gồm cả "important_tag".

Tôi đã đọc phiên bản tiếp theo của Lược đồ XML cho phép bạn nói ý của bạn: bất kỳ thẻ nào ngoại trừ important_tag.

Đối sánh XML theo hai cách khác nhau tương tự như cụm từ thông dụng "a * a *" khớp "a" theo hai cách khác nhau (một "a" đầu tiên; hoặc một giây "a"). Sự mơ hồ này thường được gọi là "không xác định" trong đặc tả XML cho các DTD, nhưng đặc tả lược đồ XML gọi nó là quy tắc phân bổ phần tử duy nhất (UPA), có nghĩa là bạn có thể biết phần nào của lược đồ nhận được từng phần của tài liệu XML.

+1

Bạn nói đúng, đó là vấn đề chính xác. Tôi đã vượt qua nó bằng cách "thay đổi các quy tắc", tức là, thực thi một lược đồ chặt chẽ hơn. Và cảm ơn ghi chú về tên thẻ - điều đó cũng đã thay đổi :) – Dana

7

Có một bài viết tuyệt vời trên MSDN nói về desigining schemas mở rộng, bạn có thể tìm here, tôi đề nghị bạn đi qua tất cả, nhưng đặc biệt để quan điểm của bạn nó giải thích tại sao bạn' tái nhận lỗi này ở điểm 2. trong "Sử dụng lược đồ XML để thiết kế định dạng XML có thể định dạng" (bạn có thể tìm kiếm "không xác định" và đi thẳng đến đó.

Về cơ bản, một khi bạn có xs: bất kỳ phần tử nào validator không thể giả định bất cứ điều gì về các yếu tố anh chị em khác, vì vậy - bạn có thể có một định nghĩa cho important_tag mà không yêu cầu attribu bắt buộc và do đó những yếu tố đó không thể được xác thực

+0

Và bài viết của Orchards tại đây: http://www.xml.com/lpt/a/1329 – annakata

+0

Có, cảm ơn; đọc cái này và nghĩ nó rất tốt. –

1

Với các yêu cầu của bạn (những thứ như "Bất kỳ thẻ nào khác không phải tuân theo bất kỳ định nghĩa nào"), Schematron, dựa trên quy tắc ("điều này phải đúng", "đó phải là sai") có thể là một giải pháp tốt hơn so với Lược đồ W3C, đó là "mọi thứ phải như thế".

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