为什么我的XML模式无法提取错误?

时间:2019-03-17 19:28:07

标签: xml xsd schema

我的模式不会处理我的数据中的错误,有明显的原因吗?请参阅下面的内容,本质上是我创建的限制,在给出其他信息后应该会出现错误,但我的情况并非如此。它似乎是有效的。在这里,我使用了字符串类型并对其进行了枚举。它应该引发验证错误,因为在某些地方拼写不正确。

public static void main(String[] args)
{
    int a[][] = new int[2][2];

    for(int i=0; i<2; ++i)
    {
        for(int j=0; j<2; ++j)
        {
            a[i][j]=Integer.parseInt(args[2*i+j]);
        }
    }
    //for print
    for(int i=0; i<2; ++i)
    {
         for(int j=0; j<2; ++j)
         { 
              System.out.print(a[i][j]+" ");
         }
         System.out.println();
    }
}

XML数据

Shorten version: 

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Midterm">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="StudentData" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element type="xs:string" name="Gnumber"/>
                            <xs:element type="xs:string" **name="ResidenceStatus"/>
                            **<xs:simpletype>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="In-state"/>
                                    <xs:enumeration value="Out-of-state"/>
                                </xs:restriction>
                            </xs:simpletype>****
                            <xs:element type="xs:string" name="FirstName"/>
                            <xs:element type="xs:string" name="MiddleInitial"/>
                            <xs:element type="xs:string" name="LastName"/>
                            <xs:element type="xs:string" name="DOB"/>
                            <xs:element type="xs:string" name="ProgramName"/>
                            <xs:element type="xs:string" name="Concentration"/>
                            <xs:element type="xs:float" name="StartYear"/>
                            <xs:element name="course">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element type="xs:string" name="Department"/>
                                        <xs:element type="xs:float" name="CatalogNumber"/>
                                        <xs:element type="xs:string" name="Semester"/>
                                        <xs:element type="xs:float" name="Year"/>
                                        <xs:element type="xs:string" name="LetterGrade"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:0)

尝试使用XSD验证示例XML时,它引发了一些错误,所以我无法重现您的问题,而只能修复XSD的错误。我使用了命令

xmlstarlet val --err --xsd source.xsd input.xml

验证您的XSD。 XSD-1.0似乎足以验证它,因此不需要XSD-1.1处理器。


源XML的问题之一似乎是ResidenceStatus值的前导和尾随空格。

将XSD应用于XML会导致错误,直到我修正了ResidenceStatus的定义。到目前为止,我无法确定这是否由于您的XSD处理器而发生。

但是您可以尝试将定义修正为

<xs:element name="ResidenceStatus">
  <xs:simpleType>
    <xs:restriction base="normalized">
        <xs:enumeration value="In-state"/>
        <xs:enumeration value="Out-of-state"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

并在normalized的根级别末尾添加xs:schema的类型定义:

<xs:simpleType name="normalized">
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="collapse"/>
  </xs:restriction>
</xs:simpleType>

此名为simpleType的{​​{1}}将删除元素值的前导和尾随空格,以便枚举匹配。

P.S .:您的XSD出现错字:
normalized中的<xs:simpletype>应该是ResidenceStatus