XML模式问题

时间:2011-05-03 16:22:47

标签: xsd

是否可以定义XML Schema(XSD)以正确描述如下文档?

<root>
    <str name="status">success</str>
    <str name="message">Your request has been processed successfuly.</str>
</root>

问题可能是<str>标记具有属性(名称)以及字符串值。 如果有人能为这段XML提出XML Schema,我将不胜感激,因为我现在有点困惑。到目前为止,我最好的尝试如下所示,但是<str>元素在此上下文中不能具有类型(例如xsd:string)。

  <xs:element name="object">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="str" minOccurs="2" maxOccurs="2">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="productName" type="xs:string"/>
          </xs:sequence>
          <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  </xs:element>

1 个答案:

答案 0 :(得分:1)

您的约束并不完全清楚,因此许多模式将验证XML,具体取决于您希望验证的宽松/紧密程度。此示例显示了一个模式,该模式强制要求元素中的两个元素,并且它们必须具有值为“status”或“message”的“name”属性。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="str" type="StrType" minOccurs="2" maxOccurs="2"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="StrType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="StrAttribute" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="StrAttribute">
    <xs:restriction base="xs:string">
      <xs:enumeration value="status"/>
      <xs:enumeration value="message"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

当然,这将允许两个元素都将name属性设置为“message”,或者首先使用“message”,然后是status。我相信模式不能定义包含两个相同名称但不同类型的元素的序列,如果您需要验证以确保第一个始终包含“status”而第二个包含“message”,则需要这些元素。