如何使用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

你是什么意思,“价值是空的”?你想接受什么类型的XML,并且你所放的限制不会接受?断言是针对XSD 1.1的,这​​并没有得到广泛的支持。你可能不需要它,即使它被支持,它也不可能帮助你。 – kumesana

+0

好的,我修改了我的帖子,希望你能更好地理解。事实上,我需要使用xml验证器来检查我的所有文件 – Stoufiler

我怀疑你意味着该值必须是0到100之间的数字,或者是一个空字符串。如果是这样,你会在AND和OR之间混淆。

一个空字符串不是XS的有效实例:整数,所以你不能定义这种类型XS的限制:整数(因为限制只能定义的值空间是基本值的子集空间)。

有两种常用的方法来定义一个简单的类型,其中值必须是一个X,或者是空的:

  1. 定义的联合类型,其部件类型是X,和一个型衍生自 的xs:串,其唯一的允许值是“”

  2. 定义一个列表类型,其项类型为X,并且其maxOccurs的是1

(在第是情况X是具有minInclusive = 0,maxInclusive = 100的xs:integer的限制。

我个人更喜欢(2):如果您使用架构感知查询和转换,它会更好。但是,如果您只使用模式进行验证,则没有区别。

+0

感谢评论,我会考虑这一点,但因为我使用python脚本,也许我可以检查我的XML文件与库ElementTree的所有值。你怎么看待这件事 ? – Stoufiler

+0

我不知道Python或ElementTree。 –

+0

好的,没问题,我会尝试做一个函数,因为我的XML文件包含超过1500000行 – Stoufiler

如果您需要接受空元素,则其内容不是整型,因为空字符串不代表数字。

你将必须解决类型xs:字符串,只是用一个接受整数或空字符串的模式来限制它。

这会工作:

<xs:simpleType> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[0-9]*"/> 
    </xs:restriction> 
</xs:simpleType> 

,因为它说你接受,数字从0到连续9,零次或多次。

如果你需要它也低于100,我会让你找到一个强制执行这个附加条件的模式。

+0

非常感谢这个解决方案,我没有关于它 – Stoufiler

+0

好吧我试过了,你的答案但它不起作用,我有这个错误'res.xml:1029800:element valeur:Schemas validity error:Element'valeur':'55'不是本地原子类型的有效值。' – Stoufiler

+0

我想你需要仔细检查你是否真的用你认为的XSD验证了你的XML。我尝试使用我的解决方案验证您的XML示例,并且它可以工作。 – kumesana