【问题标题】:Why won't my XML schema pick up the errors?为什么我的 XML 模式不能识别错误?
【发布时间】:2019-03-18 04:46:35
【问题描述】:

我的架构无法识别数据中的错误,是否有明显的原因?请参阅下文,基本上对于我创建的限制,当提供其他信息时它应该会出现错误,但我的情况并非如此。它只是看起来有效。在这里,我使用类型字符串应用了一个限制并枚举它。它应该抛出验证错误,因为在某些地方拼写不正确。

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>

XML 数据

<Midterm>
    <StudentData>
        <Gnumber>   G12654312   </Gnumber>
        <ResidenceStatus>   In-state    </ResidenceStatus>
        <FirstName> ALBERTO </FirstName>
        <MiddleInitial> L   </MiddleInitial>
        <LastName>  SMITH   </LastName>
        <DOB>   2/3/1981    </DOB>
        <ProgramName>   MS Health Informatics   </ProgramName>
        <Concentration> Data analytics  </Concentration>
        <StartYear> 2014    </StartYear>
        <course> 
            <Department>    HAP </Department>
            <CatalogNumber> 463 </CatalogNumber>
            <Semester>  SPRING  </Semester>
            <Year>  2014    </Year>
            <LetterGrade>   B+  </LetterGrade>
        </course>
    </StudentData>
</Midterm>

【问题讨论】:

  • 好吧,您的 XSD 不完整,您还没有共享相关的 XML。所以这个问题没有提供minimal reproducible example - 这是这类问题的必填项。
  • 另外,您如何使用架构验证您的 xml?
  • @DanielHaley 我正在根据我的 xml 数据验证它,两者都说有正确的语法。是这个意思吗?
  • @zx485 有没有办法附加xml?我收到的错误是代码太多,无法开始
  • 在向其他人寻求帮助时,您绝对必须包含您的 XML,但是您必须将您的 XML 和 XSD 精简到一个仍然存在问题的相当小的集合。见minimal reproducible example。通常,创建 MCVE 的过程甚至会直接揭示问题。

标签: xml xsd schema


【解决方案1】:

尝试使用 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>

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

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

这个名为normalizedsimpleType 将删除元素值的前导和尾随空格,以便枚举匹配。

P.S.:您的 XSD 有一个错字:
ResidenceStatus 中的&lt;xs:simpletype&gt; 应该是 &lt;xs:simpleType&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2010-10-19
    • 2013-11-15
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多