首页 > 解决方案 > 通过模式进行 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>

标签: xmlxsd

解决方案


不幸的是,您选择将数据表示为<field name="data1">123</field>而不是更简单的<data1>123</data1>,因为这使得为数据编写 XSD 模式变得非常困难。在 XSD 中,验证规则由元素的名称驱动。

有解决方法:

  • 使用 XSD 1.1,您可以使用“条件类型分配”将类型分配给以属性值为条件的元素。但是很多 XSD 处理器不支持 XSD 1.1

  • 您可以在验证之前将数据转换为更简单的形式。但是,模式诊断将与转换后的文档相关,而不是与原始文档相关。


推荐阅读