XSD用于复杂的XML结构

时间:2017-09-05 06:43:11

标签: xml xsd xml-parsing xsd-validation

我有一个相当复杂的XML结构,我试图验证,我似乎无法想出一个XSD结构,可以让我表达以下内容:

<foo fooAttribute1="..." fooAttribute2="..." ...>
  <bar1 id="1" ... />
  <bar1 id="2" ... />
  <bar2 id="1" ... />
  <bar2 id="2" ... />
  <![MyFormattedTextGoesHere[foo text goes here]]>
</foo>

所以,我想要一个可以包含

foo
  • 属性
  • 0 .. * bar1元素
  • 0 .. * bar2元素
  • 格式化的文字(例如以<![MyFormattedTextGoesHere[开头,以]]>
  • 结尾

在相关说明中:我是否也可以像这样验证属性<xml someAttribute=$... />(必须以$开头)?

我目前拥有的是

<xs:element name="foo" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="bar1" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="id" form="unqualified" type="xs:string" />
          <xs:attribute name="..." form="unqualified" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="bar2" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="id" form="unqualified" type="xs:string" />
          <xs:attribute name="..." form="unqualified" type="xs:string" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="fooAttribute1" form="unqualified" type="xs:string"/>
    <xs:attribute name="fooAttribute2" form="unqualified" type="xs:string"/>
    <xs:attribute name="..." form="unqualified" type="xs:string" />
    <!-- accept/validate text here? -->
  </xs:complexType>
  <!-- or here? -->
</xs:element>

1 个答案:

答案 0 :(得分:1)

由于<!后跟一般文字,上面的XML格式不正确。这里的含义可能是CDATA部分,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<foo fooAttribute1="$..." fooAttribute2="..." >
   <bar1 id="1" />
   <bar1 id="2" />
   <bar2 id="1" />
   <bar2 id="2" />
   <![CDATA[MyFormattedTextGoesHere[foo text goes here]]>
</foo>

上述XML有效的模式的一个很好的起点是:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="beginswithdollar">
        <xs:restriction base="xs:string">
            <xs:pattern value="\$.*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="foo">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="bar1" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence/>
                        <xs:attribute name="id" type="xs:string"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="bar2"  minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence/>
                        <xs:attribute name="id" type="xs:string"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="fooAttribute1" type="beginswithdollar"/>
            <xs:anyAttribute processContents="lax"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

XML Schema不支持一些事情:

  • XML Schema无法看到文本是否在CDATA部分中。 CDATA部分用于避免转义特殊字符。
  • 复杂类型可以是混合内容,也可以不是。如果是混合内容,则无法控制文本出现的位置或类型的位置:它也可能出现在bar*元素之前或之间。
  • xs:anyAttribute可以允许属性不受限制,但一般不能限制其类型。例如,在上述模式中,属性fooAttribute1必须以美元开头,而允许任何其他属性没有限制。

如果支持XML Schema 1.1,还有assert功能允许表达用户定义的约束。这可能是一种以定制方式进一步限制实例有效性的方法,超出了其他XML Schema组件所能做的。