获取XSD属性的错误

时间:2015-02-06 16:02:27

标签: xml xsd

大家好我正在学习如何验证XML文件,但我收到了属性部分的错误。所以这是我的XML文件:

<?xml version="1.0" encoding="ISO88591"?>

<feedback xs:noNamespaceSchemaLocation = "Num1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">

<studentemail>s1@uom.ac.mu</studentemail>

<modulename code="CSE2041">Web Tech II</modulename>

<moduleyear>2010</moduleyear>

<classsize>Adequate</classsize>

</feedback>

这是XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="feedback">
<xs:complexType>
<xs:sequence>

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

<xs:element name="modulename" type="xs:string">
<xs:complexType>
<xs:sequence>

<xs:element name="moduleyear" type="xs:integer"/>
<xs:element name="classsize" type="xs:string"/>

</xs:sequence>
<xs:attribute name="code" type="xs:string"/> //errors
</xs:complexType>
</xs:element>

</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

错误消息是:

XML文档中的错误:     
4:52 cvc-complex-type.2.3:元素'modulename'不能有字符[children],因为类型的内容类型只是元素。     
4:52 cvc-complex-type.2.4.b:元素'modulename'的内容不完整。其中一个'{“”:moduleyear}'是预期的。     
5:13 cvc-complex-type.2.4.d:从元素'moduleyear'开始发现无效内容。此时不会有子元素。

文件xml-schema中的错误:     
10:48 src-element.3:元素'modulename'同时具有'type'属性和'anonymous type'子元素。其中只允许其中一个元素。

请帮帮我。感谢。

2 个答案:

答案 0 :(得分:1)

如果对其进行一处更改,您将能够成功验证XML:

  1. encoding="ISO88591"更改为encoding="ISO-8859-1"
  2. 对XSD进行了两处更改:

    1. moduleyearclasssize移至兄弟姐妹而不是modulename的子女。
    2. 修复modulename的内容模型以使用string-content-with-attributes模式,如下所示:
    3. XSD

      <?xml version="1.0" encoding="UTF-8"?>
      <xs:schema elementFormDefault="qualified"
                 xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="feedback">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="studentemail" type="xs:string"/>
              <xs:element name="modulename">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="code" type="xs:string"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="moduleyear" type="xs:integer"/>
              <xs:element name="classsize" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:schema>
      

答案 1 :(得分:0)

如果您希望元素包含字符内容和属性但不包含子元素,那么您需要为complexType提供simpleContent 扩展的简单类型角色内容:

<xs:element name="modulename">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute ....

如果你想将facets应用于字符串值(例如,禁止空字符串值),那么你必须分两个阶段进行,首先使用facets声明一个名为simpleType

<xs:simpleType name="nonEmptyString">
  <xs:restriction base="xs:string">
    <xs:minLength value="1" />
  </xs:restriction>
</xs:simpleType>

然后给元素complexType扩展简单的

<xs:element name="modulename">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="nonEmptyString">
        <!-- attribute declarations go here -->