由于以下原因,上面的XML格式不正确
<!
<?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模式不支持以下几点:
-
XML模式看不到文本是否位于CDATA节中。CDATA节用于避免转义特殊字符。
-
bar*
元素。
-
xs:anyAttribute
fooAttribute1
必须以美元开头,而任何其他属性都不受限制。
如果支持XML模式1.1,那么还有
assert
允许表达用户定义约束的功能。这可能是一种以定制方式进一步限制实例有效性的方法,超越了其他XML模式组件的功能。