这个XML Schema有什么根本错误吗?

时间:2011-03-02 01:08:08

标签: xml xsd schema

我对XML Schema只有基本的了解。这基本上是我第一次以任何严肃的方式与他们互动而且我遇到了一些问题。我已经阅读了谷歌上的XSD,所有内容都可以看到这个文件。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="credits">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="property" maxOccurs="16" minOccurs="13" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="property" type="xs:string">    
    <xs:complexType>        
        <xs:sequence>            
            <xs:element ref="item" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute ref="name" use="required"/>
    </xs:complexType>

  </xs:element>

  <xs:element name="item" type="xs:string"/>

  <xs:attribute name="name" type="xs:string">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="example1"/>
          <xs:enumeration value="example2"/>
          <xs:enumeration value="example3"/>
          <xs:enumeration value="example4"/>
          <xs:enumeration value="example5"/>
          <xs:enumeration value="example6"/>
          <xs:enumeration value="example7"/>
          <xs:enumeration value="example8"/>
          <xs:enumeration value="example9"/>
          <xs:enumeration value="example10"/>
          <xs:enumeration value="example11"/>
          <xs:enumeration value="example12"/>
          <xs:enumeration value="example13"/>
          <xs:enumeration value="example14"/>
          <xs:enumeration value="example15"/>
          <xs:enumeration value="example16"/>
        </xs:restriction>
      </xs:simpleType>
  </xs:attribute>

</xs:schema>

以下是我加载它的方式:

SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
Schema schemaXSD = schemaFactory.newSchema( new File ( "test.xsd" ) );

我收到如下例外情况:

  

org.xml.sax.SAXParseException:   src-element.3:元素'property'具有   'type'属性和a   '匿名型'孩子。只有一个   这些元素是允许的。

感谢您的帮助!关于阅读/使用他人创建的模式的任何一般建议也表示赞赏! :d

2 个答案:

答案 0 :(得分:6)

  

元素'property'具有'type'属性和'anonymous type'子

换句话说,你说type="xs:string"这就规定了像<property>foo</property>这样的节点。但是你也在item中加入了一个ComplexType property,这就规定了像<property><item>...</item></property>这样的节点。这是解析器认为是错误的矛盾。

如果您希望在每个item 中存储多个property,并且每个property存储一个单独的字符串,请将此字符串存储为单独的节点,带有标记或属性property的子级。例如。 <property mystring="foo"><item>...</item></property>

答案 1 :(得分:5)

此位是您的问题代码:

<xs:element name="property" type="xs:string">    
    <xs:complexType>        
        <xs:sequence>            
            <xs:element ref="item" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute ref="name" use="required"/>
    </xs:complexType>

  </xs:element>

删除外部元素上的类型(type="xs:string"),或删除匿名内部complexType元素(<xs:complexType> ... </xs:complexType>