2012-12-04 56 views
4

我繼承了一些2004年最後更新的XML模式。自那時起IT一直在工作,但軟件更新已導致一些問題。 xml不再在XMLspy中驗證。XML Schema選擇不同序列中的不同類型的相同元素導致類型錯誤

無論如何,問題似乎是通過定義具有不同名稱的幾個不同simpleType來定義元素的當前方式是不正確的。我不明白如何解決這個問題。

用XMLspy 2004打開文件xml驗證就好了。

開口與lastes XMLSPY我收到以下錯誤的文件:

Element 'Element' is not consistent with element 'Element'. 
    Details: 
     cos-element-consistent.2: Both type definitions ('type2' and 'type1') must have the same name 

注:以下XML /模式不是實際 XML。我重新創建了它,並將其推廣以防止出現任何類型的問題(在這裏發佈實時程序的內部工作有點不合時宜)。所以,如果你看到一個錯字,這是我的錯,而不是Schema的錯。

的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <FirstElement></FirstElement> 
    <SecondElement> 
     <Element></Element> 
     <Parameters> 
      <Param value="#Value#">name1</Param> 
     </Parameters> 
    </SecondElement> 
</Package> 

他們給我的XML模式,它產生錯誤:

<?ml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Package"> 
     <xs:complexType> 
      <xs:choice> 
       <xs:sequence> 
        <xs:element name="FirstElement"/> 
        <xs:element name="SecondElement"> 
         <xs:complexType> 
          <xs:group ref="Group1"/> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       <xs:sequence> 
        <xs:element name="FirstElement"/> 
        <xs:element name="SecondElement"> 
         <xs:complexType> 
          <xs:group ref="Group2" /> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
      </xs:choice> 
     </xs:complextype> 
    </xs:element> 
    <xs:group name="Group1"> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="Element" type="type1"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="Element" type="type2"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="Element" type="type3"/> 
      </xs:sequence> 
     </xs:choice> 
    </xs:group> 
    <xs:group name="Group2"> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="Element" type="type1"/> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="Element" type="type4"/> 
       <xs:element name="Parameters" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Param"> 
           <xs:simpleType> 
            <xs:restriction base="xs:string"> 
             <xs:enumeration value="TRUE"/> 
             <xs:enumeration value="FALSE"/> 
            </xs:restriction> 
           </xs:simpleType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:choice> 
    </xs:group> 

    <xs:simpleType name="type1"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="ONE"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="type2"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="TWO"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="type3"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="THREE"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="type4"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="FOUR"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

這將是真棒,如果有人給我一些有識之士就如何保持邏輯模式在使XML有效的同時進行檢查。

謝謝!

+1

你進入了「共現約束」的複雜世界。這是您想要根據元素的同胞來限制元素的位置。有幾種方法:XSL錯誤解析,Schematron和XML Schema 1.1。最簡單的做法是將約束作爲業務邏輯放在應用程序中。 http://www.w3.org/wiki/Co-occurrence_constraints –

回答

0

將David W的評論發佈爲答案,以提高新會員或訪問者的可讀性。

You're into the complex world of "co-occurrence constraints". It's where you want to restrict an element based on the element's siblings. There are a few methods: XSL error parsing, Schematron, and XML Schema 1.1. The easiest thing to do is put the constraints as business logic in the application.
And Here is a wiki Link for further info.

相關問題