首页 文章

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

提问于
浏览
0

考虑我的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 value b / w标签)它没有显示错误...但是如果标签没有值,我想显示错误 . 我该怎么办?你能尽快给我一个解决方案吗?

1 回答

  • 2

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

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

    根据XSD有效 .

    首先你必须意识到,在许多语言中,空字符串和空值是 not 相同,例如在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>
    

相关问题