XSD验证在xml标记元素没有值的情况下显示错误

时间:2012-03-15 07:56:03

标签: xml xsd xml-validation

考虑我的xml是这样的。它包含一个root标签employee和2个子标签都是字符串类型

<employee>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</employee>

和相应的xsd一样

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" minOccurs="1"/>
      <xs:element name="lastname" type="xs:string"minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
</xs:element> 

我想验证第一个名字和姓氏应该是字符串,它应该出现。当我给出type =“xs:string”和minOccurs =“1” 并给出了这样的名字标签(ie.no值b / w标签)它没有显示错误......但是如果标签没有值,我想显示错误。我该怎么办? 你能尽快给我一个解决方案吗?

1 个答案:

答案 0 :(得分:2)

我希望我能理解你,你的问题是,

<employee>
  <firstname></firstname>
  <lastname>Smith</lastname>
</employee>

根据XSD有效。

首先,您必须意识到在许多语言中,空字符串和空值相同,例如在Java中:

String s1 = "";   // empty string, length is 0
String s2 = null; // null value, has no length...

对于其中null和空字符串相同的Oracle PL / SQL,情况并非如此。

所以我猜这个有效的XML(根据你的XSD)也不适合你:

<employee>
    <firstname xsi:nil="true" />
    <lastname xsi:nil="true" />
</employee>

如果您具有firstname / lastname必须满足的附加条件,则必须创建自己的类型:

<xs:element name="employee">
    <xs:complexType>
        <xs:sequence>
            <!-- changed -->
            <xs:element name="firstname" type="e:firstnameType" />
            <!-- not changed -->
            <xs:element name="lastname" type="xs:string" minOccurs="1" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:simpleType name="firstnameType">
    <xs:restriction base="xs:string"> 
        <xs:whiteSpace value="collapse" />
        <xs:minLength value="1" />
    </xs:restriction> 
</xs:simpleType>

崩溃的好描述是here。您可以找到其他字符串限制here

对于其他人,我正在添加完整的XSD和XML文件:

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:e="employee"
    targetNamespace="employee"
    elementFormDefault="qualified">
    <xs:element name="employee">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="e:firstnameType" />
          <xs:element name="lastname" type="xs:string" minOccurs="1"  />
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    <xs:simpleType name="firstnameType">
        <xs:restriction base="xs:string"> 
            <xs:whiteSpace value="collapse" />
            <xs:minLength value="1" />
        </xs:restriction> 
    </xs:simpleType>
</xs:schema>

XML

<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns="employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <firstname>Martin</firstname>
  <lastname xsi:nil="true"></lastname>
</employee>