2015-05-20 21 views
1

我想用XSD驗證XML,但我不明白我的XSD有什麼問題。爲什麼我的xsd:不同類型的元素之間的選擇失敗?

XML

<?xml version="1.0" encoding="UTF-8"?> 
<Grades xs:noNamespaceSchemaLocation="grade.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
    <Grade description="Pass"> 
     <LetterGrade>A+</LetterGrade> 
     <GradePoint>4.00</GradePoint> 
     <Percentage>80% and above</Percentage> 
    </Grade> 
    <Grade description="Pass"> 
     <LetterGrade>A</LetterGrade> 
     <GradePoint>4.00</GradePoint> 
     <Percentage>70% to 80%</Percentage> 
    </Grade> 
    <Grade description="Pass"> 
     <LetterGrade>B</LetterGrade> 
     <GradePoint>3.00</GradePoint> 
     <Percentage>60% to 70%</Percentage> 
    </Grade> 
    <Grade description="Pass"> 
     <LetterGrade>C</LetterGrade> 
     <GradePoint>2.00</GradePoint> 
     <Percentage>50% to 60%</Percentage> 
    </Grade> 
    <Grade description="Pass"> 
     <LetterGrade>D</LetterGrade> 
     <GradePoint>1.00</GradePoint> 
     <Percentage>40% to 50%</Percentage> 
    </Grade> 
    <Grade description="Fail"> 
     <LetterGrade>F</LetterGrade> 
     <GradePoint>0</GradePoint> 
     <Percentage>Below 40%</Percentage> 
    </Grade> 
    <Grade description="Incomplete"> Incomplete module/project/independent study due 
    to medical/financial/other reasons (may be in 1 or both components of the module). 
     <LetterGrade>N</LetterGrade> 
    </Grade> 
</Grades> 

XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:complexType name="gradeDetails"> 
    <xs:sequence> 
     <xs:element name="LetterGrade" type="xs:string"/> 
     <xs:element name="GradePoint" type="xs:decimal"/> 
     <xs:element name="Percentage" type="xs:string"/> 
    </xs:sequence> 
    <xs:attribute name="description" type="xs:string"/> 
</xs:complexType> 

<xs:complexType name="gradeNode"> 
    <xs:sequence> 
     <xs:element name="LetterGrade" type="xs:string"/> 
    </xs:sequence> 
    <xs:attribute name="description" type="xs:string"/> 
</xs:complexType> 

<xs:element name="Grades"> 
    <xs:complexType mixed="true"> 
     <xs:choice> 
      <xs:element name="Grade" type="gradeDetails" minOccurs="1" maxOccurs="unbounded"/> 
      <xs:element name="Grade" type="gradeNode" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

我試圖與在線驗證xmlvalidation.com驗證它,我得到這些錯誤:

錯誤在XML文檔中:
36:10 cvc-complex-type.2.3:元素'Grade'不能包含character [children],因爲該類型的內容類型僅爲元素。
36:10 cvc-complex-type.2.4.b:元素'Grade'的內容不完整。預計會有'{「」:GradePoint}「之一。

有點,我明白這些錯誤信息。我知道這是因爲在最後的<Grade>標籤中缺少元素。爲了解決它,我創建了2個全局類型並使用了選擇。它現在有什麼問題?

回答

1

您寫的XSD本身無效,因爲Grade元素(作爲Grades的子元素)在您嘗試執行時不能有兩種不同的類型。您應該已經收到一個錯誤信息有關此內容大致如下的行:

COS元素一致:錯誤類型「#AnonType_Grades」。 組中出現多個 名稱爲「成績」且類型不同的元素。

COS-nonambig:級別和級(或從它們的取代 組元素)違反 「唯一粒子屬性」。在針對該模式進行驗證 期間,將爲這兩個粒子創建歧義。

下面顯示的簡化XSD消除這些錯誤併成功驗證對您不變的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="GradeType" mixed="true"> 
    <xs:sequence> 
     <xs:element name="LetterGrade" type="xs:string"/> 
     <xs:element name="GradePoint" minOccurs="0" type="xs:decimal"/> 
     <xs:element name="Percentage" minOccurs="0" type="xs:string"/> 
    </xs:sequence> 
    <xs:attribute name="description" type="xs:string"/> 
    </xs:complexType> 

    <xs:element name="Grades"> 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
     <xs:element name="Grade" type="GradeType" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
+0

非常有效地使用的minOccurs的。沒想到這個。謝謝。 –

相關問題