为什么我收到关于子元素名称空间的错误?

时间:2015-11-16 07:33:30

标签: xml xsd schema

当我尝试验证此代码时,出现错误...

<?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>

2 个答案:

答案 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将有效。

请注意:

  • 通常,名称空间URI应采用http://some.url/hotel
  • 形式