XML未针对XSD进行验证

时间:2013-12-18 17:07:43

标签: xml xsd xsd-validation

给出以下代表性片段:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:j="http://foo" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://foo" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2">
<xs:element name="Event">
    <xs:annotation>
        <xs:documentation>The Incident beginning and end date and time</xs:documentation>
    </xs:annotation>
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="j:EventType"/>
        </xs:complexContent>
    </xs:complexType>
</xs:element>
<xs:complexType name="EventType">
    <xs:sequence>
        <xs:element ref="j:EventDate" minOccurs="0"/>
        <xs:element ref="j:EventTime" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute ref="j:EventType" use="required"/>
</xs:complexType>
<xs:attribute name="EventType">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="Beginning"/>
            <xs:enumeration value="Ending"/>
        </xs:restriction>
    </xs:simpleType>
</xs:attribute>

以下XML未验证。具体来说,它不会验证EventType属性。

<?xml version="1.0" encoding="utf-8"?>
<SomeDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://hostedbykarpel.com/Schemas/ReferralDocument_2">
  <Event EventType="TypeOne">
    <EventDate>2013-12-18</EventDate>
    <EventTime>00:15:28</EventTime>
  </Event>
</SomDoc>

但是,如果我在元素中明确添加命名空间,那么它可以工作:

<Event a:EventType="TypeOne" xmlns:a="http://foo">
  <EventDate>2013-12-18</EventDate>
  <EventTime>00:15:28</EventTime>
</Event>

命名空间已在文档的根目录中声明。为什么我需要再次指定它才能显示属性? Event元素本身验证就好了,它只是不会的EventType属性。

1 个答案:

答案 0 :(得分:1)

我认为此行为是由ref引用的命名属性的规范定义的。我不相信有办法改变它。但是,您可以通过不使用ref来解决问题。

<xs:complexType name="EventElement">
  ...
  <xs:attribute name="EventType" type="j:EventTypeValue" use="required"/>
  ...
</xs:complexType>
...
<xs:simpleType name="EventTypeValue">
  ...
</xs:simpleType>