通过架构进行XML验证

时间:2018-10-29 09:05:15

标签: xml xsd

下面是xml,我需要创建一个xml格式(xsd文件)以验证字段名称,即在tableData节点(位于xml下方)中,第一列名称应为“ field”,关键字为“名称”,其值应为“ 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中的第一行),我试图创建一个架构并将其添加到上面提到的架构之前,但是这会产生错误:元素“表”不能包含子元素'tableData',因为父元素的内容模型仅是文本。我在上述架构之上添加的架构是:

   <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>

1 个答案:

答案 0 :(得分:0)

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

有解决方法:

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

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