当我尝试验证此代码时,出现错误...
<?xml version="1.0"?>
<h:hotel xmlns:h="hotel">
<h:existingRooms>
<room>101</room>
<room>102</room>
<room>201</room>
</h:existingRooms>
</h:hotel>
错误:
cvc-complex-type.2.4.a: Invalid content was found starting with element '{"hotel":existingRooms}'. One of '{existingRooms}' is expected.
当我将XML编辑为此时,我不再收到错误:
<?xml version="1.0"?>
<h:hotel xmlns:h="hotel">
<existingRooms>
<room>101</room>
<room>102</room>
<room>201</room>
</existingRooms>
</h:hotel>
我的XSD(带错误)是:
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:h="hotel"
targetNamespace="hotel">
<element name="hotel">
<complexType>
<sequence>
<element name="existingRooms">
<complexType>
<sequence>
<element name="room" type="integer" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
答案 0 :(得分:1)
如果您将elementFormDefault="qualified"
添加到架构的根目录,
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:h="hotel"
targetNamespace="hotel">
<element name="hotel">
<complexType>
<sequence>
<element name="existingRooms">
<complexType>
<sequence>
<element name="room" type="integer" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
然后你将消除意外错误,但接下来会发现以下错误:
[错误] try.xml:6:15:cvc-complex-type.2.4.a:内容无效 从元素'room'开始发现。 '{“hotel”:room}'之一是 预期
但你可能已经预料到了这一点,并且很容易纠正它,
<?xml version="1.0"?>
<h:hotel xmlns:h="hotel"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="hotel try.xsd">
<h:existingRooms>
<h:room>101</h:room>
<h:room>102</h:room>
<h:room>201</h:room>
</h:existingRooms>
</h:hotel>
并根据请求对您的XSD成功验证XML。
另见:
答案 1 :(得分:0)
因为您的架构elementFormDefault
中的隐含设置被设置为unqualified
。
这意味着您设置的架构等同于以下声明:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:h="hotel" targetNamespace="hotel"
elementFormDefault="unqualified" attributeFormDefault="unqualified">
因此可以理解,只有全局元素是合格的,所有其他元素都是不合格的。
如果您要求所有元素都合格(使用uri hotel
在名称空间中),您可以通过将elementFormDefault
设置为qualified
来修改架构:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:h="hotel" targetNamespace="hotel"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
有效的XML实例将是:
<?xml version="1.0"?>
<h:hotel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="hotel hotel.xsd" xmlns:h="hotel">
<h:existingRooms>
<h:room>101</h:room>
<h:room>102</h:room>
<h:room>201</h:room>
</h:existingRooms>
</h:hotel>
就像这个替代实例一样:
<?xml version="1.0"?>
<hotel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="hotel hotel.xsd" xmlns="hotel">
<existingRooms>
<room>101</room>
<room>102</room>
<room>201</room>
</existingRooms>
</hotel>
如果您只需要existingRooms
元素进行限定,则将其设置为您的架构:
<element name="existingRooms" form="qualified">
,您提供的第一个XML将有效。
请注意:
http://some.url/hotel