XML Schema验证报错:元素'name'不符合内容模型'(name)'求解决
搞定你的XML Schema验证问题
嘿,刚看完你的代码,立刻就发现了问题所在——你的Schema里有几个地方没考虑到元素的重复出现,这就是导致验证报错的核心原因!我来一步步帮你修正,顺便把潜在的小问题也处理掉:
1. 允许<presenters>下有多个<name>元素
你XML里每个<presenters>都有好几位演讲者,但你的Schema里<xs:element name="name">默认只允许出现1次(XML Schema中maxOccurs默认值是1),这就是第17行报错的直接原因。你需要给它加上maxOccurs="unbounded",让它能接受多个<name>节点:
<xs:element name="name" maxOccurs="unbounded">
2. 允许根元素下有多个<presentation>
同样的道理,你的XML里有两场演讲,但Schema里的<presentation>元素也没设置重复次数,所以也要加上maxOccurs="unbounded":
<xs:element name = "presentation" maxOccurs="unbounded">
3. 修正id属性的正则表达式
你给id写的<xs:pattern value="[X-Y][0-9][0-9][0-9]"/>有点小问题:[X-Y]是匹配从X到Y的所有字母(包括中间的W、V这些),但你的XML里id都是X或Y开头的,应该改成[XY];另外[0-9][0-9][0-9]可以简化成[0-9]{3},更简洁:
<xs:pattern value="[XY][0-9]{3}"/>
4. 小细节:清理XML里的多余空格
你的XML里<last>Presley </last>末尾多了个空格,虽然Schema不会报错,但为了数据整洁,建议把这个空格去掉。
修正后的完整Schema
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="jon:presentations" xmlns:prs="jon:presentations"> <xs:element name = "presentations"> <xs:complexType> <xs:sequence> <xs:element name = "presentation" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name = "topic"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="genre"> <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> <xs:element name="presenters"> <xs:complexType> <xs:sequence> <xs:element name="name" maxOccurs="unbounded"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="first" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="middle" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="last" type="xs:string"/> </xs:sequence> <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:attribute name="id"> <xs:simpleType> <xs:restriction base="xs:ID"> <xs:pattern value="[XY][0-9]{3}"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="date" type="xs:date"/> <xs:attribute name="length" type="xs:duration"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
现在用这个Schema去验证你的XML,肯定能顺利通过啦!刚开始玩XML Schema很容易忽略这些默认的出现次数设置,多试几次就熟练了~
内容的提问来源于stack exchange,提问作者Jonathan Collins
相关产品推荐
相关产品推荐

