2009-01-23 53 views
1

我必須爲已經使用的XML格式創建架構。現有的XML已經由一個不同的程序生成,聽起來好像很難找到所有需要更改的地方,以便使用更常規的XML格式。XML架構 - 解決唯一標籤約束問題

這裏有類似我們的XML結構的例子:

<data> 
    <summary>some info</summary> 
    <error>error message (only if there was an error)</error> 
    <details>more info 
     <x>more</x> 
     <y>even more</y> 
    </details> 
    <error>another error message</error> 
    <z>some extra info</z> 
</data> 

請注意,錯誤標籤在同一水平重用,某些項目後說到,但不是別人,所以我不能只是設置的maxOccurs =」無界」。我試過在xsd:sequence中包裝關聯的錯誤/其他標籤對,但這並不能解決問題,因爲我仍然有效地打破了唯一粒子屬性規則。

這甚至可以完成,還是我需要讓其他開發人員知道此架構不會驗證?

+0

你的例子是格式不正確的XML(兩個密切的細節標籤)。我建議你解決這個問題,並提供一些其他示例來演示需要處理的XML中的變體。 – Alohci 2009-01-24 02:08:46

回答

2

我對XML schema standard的讀法說你可能很安全。您只需在模式中定義具有相同名稱的非連續元素,以反映生成的(或可能)XML。只要所有「錯誤」實例都是總是被其他元素分隔開而不是連續的,這應該不成問題。例如,像:

 
    <xs:element name="data"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" /> 
     <xs:element ref="error" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" /> 
     <xs:element ref="error" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="error" type="xs:string"/> 

    <xs:complexType name="detailsType"> 
    .... 
    </xs:complexType> 

如果細節還的minOccurs =「0」和第一個「錯誤」上面有一個maxOccurs的> 1,那麼你失敗的唯一粒子屬性規則,因爲驗證無法驗證,如果你在一行中有兩個錯誤元素,它們屬於哪個模式中的「錯誤」實例。但是,只要在模式中可以唯一標識每個「錯誤」實例,由於錯誤元素和介入元素的「minOccurs」和「maxOccurs」的使用良好,那麼您就很好。

只要模式驗證程序始終可以明確指出使用minOccurs和maxOccurs(例如)引用了哪個實例,您甚至可以連續出現「錯誤」實例。

想想xhtml,其中元素可以以任意順序出現,並且可以任意重複。

編輯:更新以反映原始問題中的編輯。