【问题标题】:XML schema validation use caseXML 模式验证用例
【发布时间】:2011-08-04 16:02:46
【问题描述】:

我有简单的元数据 XML 格式

<?xml version="1.0" encoding="utf-8"?>

<metas>
<meta type="date">
    <code>storage_date</code>
    <value>12-02-1989</value>
</meta>
<meta type="int">
    <code>weight</code>
    <value>12</value>
</meta>
<meta type="bool">
    <code>foo</code>
    <value>true</value>
</meta>
<meta type="text">
    <code>bar</code>
    <value>Hello world</value>
</meta>    
</metas>

我希望架构考虑到我的元类型并根据它是 int bool 日期还是文本进行验证。

目前为止

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="metas" type="metasType" />
  <xsd:complexType name="metasType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="meta" type="metaType" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="metaType">
    ???
</xsd:schema>

我正在尝试做的事情是否可以使用模式进行验证?

【问题讨论】:

    标签: xml validation xsd


    【解决方案1】:

    所以你希望 meta 元素上的 type 属性来控制 meta 元素的内容。一种方法是:

    1. 让 metaType 为空类型
    2. 为每种可能性从 metaType 扩展创建一个新类型
    3. meta 元素的 type 属性为 xsi:type
    4. type 属性的值应该标识正在使用的 metaType 的实际子类型

    例如您将 meta_int 定义为 metaType 的子类型。当您在那里定义值元素时,它将是类型 xs:int。然后你将在你的 XML 中拥有:

    <meta xsi:type="meta_int">
      <code>weight</code>
      <value>12</value>
    </meta>
    

    另一种方法是使用不同的元素名称而不是类型属性(例如,一个 meta_int 元素)。然后,您可以使用选择组在各种 meta_* 元素之间进行选择。

    另一种方法可能是使用断言,但这是 XSD 1.1 的一个功能,尚未正式 (AFAIK)。

    我不确定您在做什么,但我认为可以公平地说,在 XSD 中,元素名称通常在控制随后的内容中最有用,而您正在尝试使用属性来做到这一点.

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2010-11-22
      • 2013-05-22
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 2010-10-25
      相关资源
      最近更新 更多