xml - 为什么我的 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>
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,它引发了一些错误,所以我无法重现您的问题,而只能修复您的 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
命名normalized
将删除元素值的前导和尾随空格,以便枚举匹配。
PS:您的 XSD 有错字:
<xs:simpletype>
ofResidenceStatus
应该是<xs:simpleType>
.
推荐阅读
- nginx - Nginx 忽略 server_name
- c++ - 试图将文本文件中的单词添加到向量中,但不断被抛出“std::out_of_range”
- oracle - 提醒用户他们的记录已经过时,因为它们已经过时了?
- ios - 使用自动布局动态设置视图上边距和高度 - swift3
- r - 将共现数据框转换为方阵
- c# - 证书签名在服务器上产生不同的签名
- javascript - React - Rendering an array of objects using Map
- r - 如何在 Neo4j Cypher 中使用 If else 或使用 RNeo4j?
- javascript - JavaScript How to run variables in if and for?
- javascript - How to build a menu list object recursively in JavaScript?