我有一个XSD文件,它应该捕获我编写的一些无效的xml,但我的程序很乐意吃掉它。如何让它正确抛出验证错误?
架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://something.com/xmlcourse"
elementFormDefault="qualified"
xmlns="http://something.com/xmlcourse"
xmlns:lexc="http://something.com/xmlcourse"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<!-- Type Definitions -->
<xs:simpleType name="nonNegativeDecimal">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="emailAddress">
<xs:restriction base="xs:string">
<xs:pattern value="[^@]+@[^.]+..+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="phoneNumber">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{3}[-.][0-9]{3}[-.][0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="address">
<xs:restriction base="xs:string">
<xs:enumeration value="apartment"/>
<xs:enumeration value="condominium"/>
<xs:enumeration value="townhouse"/>
<xs:enumeration value="duplex"/>
<xs:enumeration value="house"/>
<xs:enumeration value="residence"/>
</xs:restriction>
</xs:simpleType>
<!-- Attributes are used for date and time on last_updated -->
<xs:complexType name="dateAndTime">
<xs:attribute name="date" type="xs:date"></xs:attribute>
<xs:attribute name="time" type="xs:time"></xs:attribute>
</xs:complexType>
<xs:complexType name="listing">
<xs:sequence>
<xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
<xs:element name="type" type="lexc:address" minOccurs="1" maxOccurs="1"></xs:element>
<xs:element name="address" type="xs:string" minOccurs="1" maxOccurs="1"></xs:element>
<xs:element name="contact_name" type="xs:string" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element name="contact_phone" type="lexc:phoneNumber" minOccurs="1" maxOccurs="3"></xs:element>
<xs:element name="contact_email" type="lexc:emailAddress" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element name="rent" type="lexc:nonNegativeDecimal" minOccurs="1" maxOccurs="1"></xs:element>
</xs:sequence>
</xs:complexType>
<!-- Schema Instance Contents -->
<xs:element name="housing">
<xs:complexType>
<xs:sequence>
<xs:element name="listings">
<xs:complexType>
<xs:sequence>
<xs:element name="listing" type="lexc:listing" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniqueId">
<xs:selector xpath="lexc:listing"></xs:selector>
<xs:field xpath="@id"></xs:field>
</xs:unique>
</xs:element>
<xs:element name="last_updated" type="lexc:dateAndTime" minOccurs="1" maxOccurs="1"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
无效的 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<housing>
<listings>
<listing>
<id>apt1</id>
<type>wrongtype</type> <!-- Type does not exist -->
<address>556 Huckaby Lane</address>
<contact_name>John Spacer</contact_name>
<contact_phone>555-555-5555</contact_phone> <!-- Over Max of 3 Phone Numbers-->
<contact_phone>555-555-5555</contact_phone>
<contact_phone>555-555-5555</contact_phone>
<contact_phone>555-555-5555</contact_phone>
<contact_email>kestrel.gmail.com</contact_email> <!-- Wrong Format for Email Address -->
<rent>123.45</rent>
</listing>
<listing>
<id>cdm1</id>
<type>condominium</type>
<address>123 Saskatoon Lane</address>
<contact_name>George Romero</contact_name>
<contact_phone>123.456.7890</contact_phone>
<contact_email>jasper@montypython.com</contact_email>
<rent>445.5</rent>
</listing>
</listings>
<last_updated date="2017-05-15" time="12:12:12" />
</housing>
我有一个XSD文件,应该捕获我编写的一些无效的xml,但我的程序很乐意吃掉它。如何让它正确抛出验证错误?
XML 根据该架构有效。它不在同一个命名空间中,因此架构实际上对其有效性没有任何意见。如果要启用警告,则会看到记录如下消息:
- 找不到元素"住房"的架构信息。
- 找不到元素"列表"的架构信息。
您的架构具有http://something.com/xmlcourse
的targetNamespace
。将 XML 更改为此命名空间中,您将看到以下错误:
- "http://something.com/xmlcourse:type"元素无效 - 值"错误类型"根据其数据类型"http://something.com/xmlcourse:address"无效 - 枚举约束失败。
- 命名空间"http://something.com/xmlcourse"中的元素"listing"在命名空间"http://something.com/xmlcourse"中具有无效的子元素"contact_phone"。预期的可能元素列表:命名空间"http://something.com/xmlcourse"中的"contact_email,租用"。
请参阅此小提琴以进行演示。