XML文件未针对XSD文件进行验证

时间:2014-07-24 22:41:02

标签: xml xsd

我是XSD的新手。我的XSD文件目前都是格式良好且有效且我的XML文件格式正确,但是当我尝试验证它时出现以下错误:"错误在8,第33列:不允许使用字符数据按内容模型"

它不希望我为该主题添加任何文本(我目前将PianoML作为导致错误的第一个主题),但是如何在XSD中修复它?我会在底部发布完整文件,但这里是我认为需要修复的代码段:

<xs:element name="topic">
    <xs:complexType>
      <xs:attribute name="genre" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ART"/>
            <xs:enumeration value="Music"/>
            <xs:enumeration value="Science"/>
            <xs:enumeration value="Technology"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

我尝试了很多事情,但一直都会遇到错误。我确信它是一个非常简单的解决方案,但我的菜鸟尝试和谷歌搜索都没有帮助。我如何允许该文本?

这是XML文件(presentations.xml):

<?xml version="1.0" encoding="UTF-8"?>
<presentations xmlns="http://www.brett.com/presentations"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.brett.com/presentations presentations.xsd"
>

  <presentation date="2013-07-31" length="PT30M">
    <topic genre="Music">PianoML</topic>
    <presenters>
      <name title="Mr." id="Y258">
        <first>Elvis</first>
        <middle>A</middle>
        <last>Presley </last>
      </name>
      <name title="Miss" id="X365">
        <first>Lady</first>
        <last>Gaga</last>
      </name>
    </presenters>
  </presentation>

    <presentation date="2013-08-05" length="PT35M">
    <topic genre="Science">AlienML</topic>
    <presenters>
         <name title="Mr." id="Y007">
        <first>Will</first>
        <last>Smith</last>
      </name>
      <name title="Mr." id="Y360">
        <first>Tommy</first>
        <first>Lee</first>
        <last>Jones</last>
      </name>
    </presenters>
  </presentation>
</presentations>

这是XSD文件(presentations.xsd):

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

  <xs:element name="presentations">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="presentation"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="presentation">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="topic"/>
        <xs:element ref="presenters"/>
      </xs:sequence>
      <xs:attribute name="date" type="xs:string" use="required"/>
      <xs:attribute name="length" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="topic">
    <xs:complexType>
      <xs:attribute name="genre" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ART"/>
            <xs:enumeration value="Music"/>
            <xs:enumeration value="Science"/>
            <xs:enumeration value="Technology"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="presenters">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element ref="name"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="name">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence maxOccurs="unbounded">
          <xs:element ref="first"/>
        </xs:sequence>
        <xs:sequence minOccurs="0">
          <xs:element ref="middle"/>
        </xs:sequence>
        <xs:element ref="last"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
      <!-- Edit 
      <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:patterrn value=""/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
       End Edit -->
      <xs:attribute name="title" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Mr."/>
            <xs:enumeration value="Mrs."/>
            <xs:enumeration value="Ms."/>
            <xs:enumeration value="Miss"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

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

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

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

</xs:schema>

2 个答案:

答案 0 :(得分:1)

您的问题是您已将Topic定义为没有扩展名且只有属性的复杂类型,因此由于分别具有PianoML和AlienML的文本内容,以下行无效。

<topic genre="Music">PianoML</topic>

&安培;

<topic genre="Science"/>AlienML</topic>

要实现您想要的目标,您需要将主题定义为

  <xs:element name="topic">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="genre" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="ART" />
                <xs:enumeration value="Music" />
                <xs:enumeration value="Science" />
                <xs:enumeration value="Technology" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

答案 1 :(得分:1)

修改topic元素的定义,如下所示:

<xs:element name="topic">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="genre" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="ART"/>
              <xs:enumeration value="Music"/>
              <xs:enumeration value="Science"/>
              <xs:enumeration value="Technology"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

来自MSDN documentation,关于<simpleContent>

  

包含对complexType元素的扩展或限制   字符数据或simpleType元素作为内容,包含否   元件。