我有一个相当复杂的XML结构,我试图验证,我似乎无法想出一个XSD结构,可以让我表达以下内容:
<foo fooAttribute1="..." fooAttribute2="..." ...>
<bar1 id="1" ... />
<bar1 id="2" ... />
<bar2 id="1" ... />
<bar2 id="2" ... />
<![MyFormattedTextGoesHere[foo text goes here]]>
</foo>
所以,我想要一个可以包含
的foo
bar1
元素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>
答案 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不支持一些事情:
bar*
元素之前或之间。xs:anyAttribute
可以允许属性不受限制,但一般不能限制其类型。例如,在上述模式中,属性fooAttribute1
必须以美元开头,而允许任何其他属性没有限制。如果支持XML Schema 1.1,还有assert
功能允许表达用户定义的约束。这可能是一种以定制方式进一步限制实例有效性的方法,超出了其他XML Schema组件所能做的。