我的XML出了什么问题?

时间:2015-04-01 15:31:15

标签: xml xsd xml-validation

有人可以帮我解决下面的XML吗?

<?xml version="1.0" encoding="UTF-8" ?>
<xs:collection-list xmlns:xs="http://www.hp.com/hpsim7.5.0.0" 
                    elementFormDefault="qualified">    
  <xs:collection name="abc" 
                 type="system" 
                 parent="Systems by Type">
    <member name="All Servers" 
            type="query" 
            display-status="0"default-view="tableview" 
            hidden="false" />
  </collection>
</collection-list>

我不确定它有什么问题。

1 个答案:

答案 0 :(得分:1)

您的XML出了什么问题,它不是 格式良好

也就是说,它不符合XML的基本要求。然后,根据您对错误的评论,指出无法找到collection-list,您的XML也不是有效。也就是说,它不符合模式指定的附加要求。您可能希望了解有关Well-formed vs Valid XML的更多信息。

下面,我将帮助您解决特定情况下的每一类问题。我将使用Xerces-J错误消息具体,但任何符合标准的XML解析器都会发出类似的错误。

良构

  

[致命错误] try.xml:9:31:元素类型“成员”必须后跟属性规范“&gt;”或“/&gt;”。

  • 解释:解析器无法完成member的处理,表明在解析属性时出现问题(在到达之前) 由>/>标记的开始标记的结尾。
  • 解决方案:在default-view="tableview"属性之前添加空格。
  

[致命错误] try.xml:12:5:元素类型“xs:collection”必须由匹配的结束标记"</xs:collection>"终止。

  • 解释:Parser看不到结束</xs:collection>,因为</collection>上缺少名称空间前缀。
  • 解决方案:将名称空间前缀添加到结束collection标记。

重复collection-list

其他说明:

  • 我会为XML Schema保留xs名称空间前缀 元素(虽然这不是绝对必要的)。
  • 我会从elementFormDefault中删除hp:collection-list属性,因为它似乎错误地从XSD复制过来。
  • 我将假设member元素也位于http://www.hp.com/hpsim7.5.0.0命名空间中,以便在下一节简化演示XML的XSD。

然后,这里,您的文字变成了格式良好的XML

<?xml version="1.0" encoding="UTF-8" ?>
<hp:collection-list xmlns:hp="http://www.hp.com/hpsim7.5.0.0">    
  <hp:collection name="abc" 
                 type="system" 
                 parent="Systems by Type">
    <hp:member name="All Servers" 
               type="query" 
               display-status="0"
               default-view="tableview" 
               hidden="false"/>
  </hp:collection>
</hp:collection-list>

有效

既然你有完善的XML,你可以继续尝试验证它,但是当你这样做时,你会遇到另一个错误:

  

[错误] try.xml:3:52:cvc-elt.1.a:找不到声明   element'hp:collection-list'。

  • 解释:解析器找不到此文件中元素的XSD,从根元素hp:collection-list开始。
  • 解决方案:提示解析器使用xsi:schemaLocation在哪里查找XSD,其值由命名空间 - 位置对组成,以空格分隔。

以下是您的XML xsi:schemaLocation暗示XSD位置:

<?xml version="1.0" encoding="UTF-8" ?>
<hp:collection-list xmlns:hp="http://www.hp.com/hpsim7.5.0.0" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://www.hp.com/hpsim7.5.0.0 try.xsd">    
  <hp:collection name="abc" 
                 type="system" 
                 parent="Systems by Type">
    <hp:member name="All Servers" 
               type="query" 
               display-status="0"
               default-view="tableview" 
               hidden="false" />
  </hp:collection>
</hp:collection-list>

这是一个验证上述XML的XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.hp.com/hpsim7.5.0.0">
  <xs:element name="collection-list">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="collection" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="member">
                <xs:complexType>
                  <xs:sequence/>
                  <xs:attribute name="name"/>
                  <xs:attribute name="type"/>
                  <xs:attribute name="display-status" type="xs:integer"/>
                  <xs:attribute name="default-view"/>
                  <xs:attribute name="hidden" type="xs:boolean"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="name"/>
            <xs:attribute name="type"/>
            <xs:attribute name="parent"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>