如何在xsd中验证空字符串值标记

时间:2010-02-14 10:15:13

标签: xsd

我有一个xml文件,它有一些日期值和其他数据类型。

<Purchasedate Name="purcaseDate" value=""/>

我正在使用xsd文件验证这些xml文件。 在xsd shcema中,我为dd/mm/yyyy格式编写了正则表达式模式。

如果value属性具有值,则此工作正常。 我的模式正在验证value属性。

字段(purchasedate)不是必需的。 如果value =“”,这意味着我的模式也在验证空字符串,这不是强制性的。

我需要验证可选字段 我也在使用<xs:attribute name="PurchaseDate" use="optional">

当值标记不为空时,我需要验证此字段。

4 个答案:

答案 0 :(得分:9)

这太容易了..

您只需要在pattern

中加入空字符串规范即可。

这是做到这一点的方法.. <xs:pattern value="|(Regular_pattern_goes_here)"/>

为了您的参考,我已经编写了一些代码块......只需通过它们即可。

示例XML:

<?xml version="1.0" encoding="utf-8"?>
<xmln xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com XMLFile1.xsd" xmlns="http://www.xsdef.com/xml/123">
  <Purchasedate Name="purcaseDate" value=""/>
</xmln>

示例XSD :(包括自定义类型def)

<xs:schema xmlns:xsLocal="http://www.xsdef.com/xml/123" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xsdef.com/xml/123" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="xmln">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Purchasedate">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="Name" type="xs:string" use="required" />
                <xs:attribute name="value" type="xsLocal:CUSTOM_DATE" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="CUSTOM_DATE">
    <xs:restriction base="xs:string">
      <xs:pattern value="|((01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/(01|02|03|04|05|06|07|08|09|10|11|12)/[1-2][0-9][0-9][0-9])"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

答案 1 :(得分:0)

尝试将此属性nillable =“true”添加到xml标记定义中 您也可以查看他的链接http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_over_st0.html
最佳Reagds,
约尔丹

答案 2 :(得分:0)

'?'正则表达式中的字符表示其前面的字符必须出现0或1次。

因此,为了解决您的问题,您需要将正则表达式括在括号中并在最后添加一个问号:

  <xs:simpleType name="PurchaseDateType">
    <xs:restriction base="xs:string">
      <xs:pattern value="(Regular_pattern_goes_here)?"/>
    </xs:restriction>
  </xs:simpleType>

在你的领域使用这种类型你应该没事

答案 3 :(得分:0)

如果您控制XML的语法,则应考虑按如下方式定义元素。由于XML-Schema已经提供了日期类型,因此除非您有充分的理由,否则应该使用它。我这样说是因为它会让其他人更容易使用xml,并让你以后使用更好的代码框架。我没有包含“name”属性,因为它对元素名称来说似乎是多余的。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="Purchasedate" nillable="true" type="xs:date"/>
<xs:element name="Purchasedate2">
    <xs:complexType>
        <xs:attribute name="value" type="xs:date"/>
    </xs:complexType>
</xs:element>
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Purchasedate"/>
            <xs:element minOccurs="0" ref="Purchasedate2"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>