xml - 通过模式进行 XML 验证
问题描述
下面是 xml ,我需要创建一个 xml 模式(xsd 文件)来验证字段名称,即在 tableData 节点中(在下面的 xml 中),第一列名称应该是“字段”,键为“名称”和它的值应该是“Data1”。我还想验证该列的值应该是 xs:integer 类型(因为值是 123)。同样需要表的所有列。我是 xml 验证的新手,因此面临问题。
XML:
<table name="Employee">
<tableData>
<field name="Data1">123</field>
<field name="Data2">234</field>
<field name="Data3">Y</field>
<field name="Data4">321</field>
</tableData>
</table>
我尝试创建架构,但未能验证 123 的类型(即 xs:integer)和其他列类型。如果有人可以提供提示,请提供相关信息。
我尝试过的架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="tableData" >
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="4" name="field" type="fieldType" minOccurs="4"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="fieldType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="validAttributeType" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="validAttributeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Data1"/>
<xs:enumeration value="Data2"/>
<xs:enumeration value="Data3"/>
<xs:enumeration value="Data4" />
</xs:restriction>
</xs:simpleType>
</schema>
此外,对于 xml 中的表名 =“Employee”(xml 中的第一行),我尝试创建一个模式并将其添加到我上面提到的模式之前,但这会给出错误:元素“表”不能包含子元素“表数据”因为父元素的内容模型只是文本。我在上述架构之上添加的架构是:
<xs:element name="table" type="mTable"/>
<xs:complexType name="mTable" >
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" fixed="Employee"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
解决方案
不幸的是,您选择将数据表示为<field name="data1">123</field>
而不是更简单的<data1>123</data1>
,因为这使得为数据编写 XSD 模式变得非常困难。在 XSD 中,验证规则由元素的名称驱动。
有解决方法:
使用 XSD 1.1,您可以使用“条件类型分配”将类型分配给以属性值为条件的元素。但是很多 XSD 处理器不支持 XSD 1.1
您可以在验证之前将数据转换为更简单的形式。但是,模式诊断将与转换后的文档相关,而不是与原始文档相关。
推荐阅读
- python - 使用字符串格式的 DataFrame 索引作为类的实例
- r - 如何从列中创建二进制虚拟变量?
- c# - 聊天机器人从后面的代码更新任务模块
- vue.js - vuejs编辑表单模态不断更新父
- arrays - (如何)可以在 Swift 中交换两个大小和类型相同的整个数组吗?
- flutter - 如何从颤动的手机中找到与电子邮件相关联的所有电子邮件地址?
- vba - 如何在 Microsoft Access 中刷新子窗体的内容?
- javascript - React Bootstrap - 'openModal' 未定义 no-undef
- json - 获取本地 JSON 返回未定义
- c++ - 从不同的地方调用 C++ 函数会导致不同的行为