我是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>
答案 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元素作为内容,包含否 元件。