如何使用XSD模式验证XML元素?
问题描述:
我想在我的XML文档中使用我的XSD架构中的条件。如何使用XSD模式验证XML元素?
我使用了限制,但它不是很强大。
这里是我做过什么,到目前为止的例子:
<xs:element name="Matricule">
<xs:complexType>
<xs:sequence>
<xs:element name="valeur">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"></xs:minInclusive>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="backgroundcolor"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这个例子正常工作,但我只是检查如果该值大于0,但我想,以验证是否值是一个整数如果该值为空。
也许这样的事情:
如果(值> 0 AND值< 100和价值= '')
我在谷歌找到了一个主题谁呼叫关于断言,所以我读该文件和我这样做
<xs:element name="Matricule">
<xs:complexType>
<xs:sequence>
<xs:element name="valeur">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"></xs:minInclusive>
**<xs:assertion test="($value mod 10) = 0"/>**
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="backgroundcolor"/>
</xs:sequence>
</xs:complexType>
</xs:element>
但它不起作用,我总是有一个错误。
为例1值:
<racine>
<row>
<Matricule>
<valeur>55</valeur>
<backgroundcolor></backgroundcolor>
</Matricule>
</row>
</racine>
为例2没有价值:
<racine>
<row>
<Matricule>
<valeur></valeur>
<backgroundcolor></backgroundcolor>
</Matricule>
</row>
</racine>
这两个例子需要是正确的,但这样一个无:
<racine>
<row>
<Matricule>
<valeur>gfd</valeur>
<backgroundcolor></backgroundcolor>
</Matricule>
</row>
</racine>
答
我怀疑你意味着该值必须是0到100之间的数字,或者是一个空字符串。如果是这样,你会在AND和OR之间混淆。
一个空字符串不是XS的有效实例:整数,所以你不能定义这种类型XS的限制:整数(因为限制只能定义的值空间是基本值的子集空间)。
有两种常用的方法来定义一个简单的类型,其中值必须是一个X,或者是空的:
定义的联合类型,其部件类型是X,和一个型衍生自 的xs:串,其唯一的允许值是“”
定义一个列表类型,其项类型为X,并且其maxOccurs的是1
(在第是情况X是具有minInclusive = 0,maxInclusive = 100的xs:integer
的限制。
我个人更喜欢(2):如果您使用架构感知查询和转换,它会更好。但是,如果您只使用模式进行验证,则没有区别。
答
如果您需要接受空元素,则其内容不是整型,因为空字符串不代表数字。
你将必须解决类型xs:字符串,只是用一个接受整数或空字符串的模式来限制它。
这会工作:
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]*"/>
</xs:restriction>
</xs:simpleType>
,因为它说你接受,数字从0到连续9,零次或多次。
如果你需要它也低于100,我会让你找到一个强制执行这个附加条件的模式。
你是什么意思,“价值是空的”?你想接受什么类型的XML,并且你所放的限制不会接受?断言是针对XSD 1.1的,这并没有得到广泛的支持。你可能不需要它,即使它被支持,它也不可能帮助你。 – kumesana
好的,我修改了我的帖子,希望你能更好地理解。事实上,我需要使用xml验证器来检查我的所有文件 – Stoufiler