XML模式验证用例

时间:2011-08-04 16:02:47

标签: xml validation xsd

我为metas提供了简单的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>

我正在尝试用模式进行验证吗?

1 个答案:

答案 0 :(得分:0)

因此,您希望元元素上的type属性控制元元素的内容。一种方法是:

  1. 让metaType为空类型
  2. 为每种可能性从metaType按扩展名创建新类型
  3. 元元素的type属性为xsi:type
  4. type属性的值应该标识正在使用的metaType的实际子类型
  5. E.g。您将meta_int定义为metaType的子类型。在那里定义value元素时,它将是xs:int类型。那么你将拥有XML:

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

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

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

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