【问题标题】:Xml validation through schema通过模式进行 XML 验证
【发布时间】:2018-10-29 09:05:14
【问题描述】:

下面是 xml ,我需要创建一个 xml 模式(xsd 文件)来验证字段名称,即在 tableData 节点中(在下面的 xml 中),第一列名称应该是“字段”,键为“ name”,它的值应该是“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>

【问题讨论】:

  • 你能告诉我们你目前的架构吗?这样我们就可以看到您需要进行哪些更改才能使其正常工作。
  • 已经添加了我目前尝试过的架构。
  • 根据您的示例 xml,字段可以包含数字和文本值。 (123/234/Y/321)。你到底想验证什么?
  • 我想验证每个字段类型(即 Data1 值是 123 所以,它应该是 xs:integer )。同样适用于所有字段 (123/234/Y/321)。

标签: xml xsd


【解决方案1】:

很遗憾,您选择将数据表示为 &lt;field name="data1"&gt;123&lt;/field&gt; 而不是更简单的 &lt;data1&gt;123&lt;/data1&gt;,因为这使得为数据编写 XSD 架构变得非常困难。在 XSD 中,验证规则由元素的名称驱动。

有一些解决方法:

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

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

【讨论】:

  • 尝试使用条件类型分配,但正如您所说,它与 XSD 1.1 和我使用的 XSD 处理器不提供对 XSD 1.1 的支持它给出错误“w3.org/2001/XMLSchema:alternative”元素不受支持在这种情况下。我认为.Net 不提供对 XSD 1.1 的支持关于如何解决它的任何建议?谢谢
  • 如果您有兴趣,我的公司 Saxonica 为 .NET 提供了 XSD 1.1 模式处理器。您无法使用 XSD 1.0 验证您的实例文档,因此必须提供一些东西。
  • 谢谢,将与撒克逊人核实。另外,正如问题中提到的另一个错误:元素'table'不能包含子元素'tableData',因为父元素的内容模型只是文本。(我也提到了架构。)这个错误基本上是在我尝试之后出现的为 xml 中的第一行添加架构。如果您能提供一些关于那里究竟是什么问题的提示,请提供。
  • 具有简单内容的复杂类型不能包含子元素(如错误消息所述)。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 2015-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多