大家好,我的xsd遇到了一些困难。这是XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<Modules xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="module.xsd">
<Module code="CSE2041">
<Name shortName="Web 2">Web Technologies II</Name>
<Level>2</Level>
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
</Module>
<Module code="CSE1244">
<Name shortName="ABCD">Some Module Name</Name>
<Level>1</Level>
<ResourcePerson>
<Name>Janet</Name>
<Surname>Higgins</Surname>
</ResourcePerson>
</Module>
</Modules>
所以基本上我对<Module code="CSE2041">
部分有疑问。这是我的XSD代码:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="moduleType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="nameType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string"/>
<xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="Modules">
<xs:complexType>
<xs:sequence>
<xs:element name="Module" type="moduleType"/>
<xs:element name="Name" type="nameType"/>
<xs:element name="Level" type="xs:integer"/>
<xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:element name="FullName" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Surname" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我在关闭<xs:element name="Module" type="moduleType"/>
标记时遇到问题。这一定是错的,因为我得到了这部分的错误。有人能告诉我如何正确关闭它吗?我的XSD文档有什么问题吗?感谢。
答案 0 :(得分:1)
如果您正确缩进代码,它会对您有所帮助。
下面
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string"/>
<xs:extension>
您没有正确关闭extension
。应该是
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string"/>
</xs:extension> <!-- Closed -->
在底部,你有一堆无用的结束标签(谁知道你可能没有向我们展示一切
在上一次结束schema
完整有效架构
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="moduleType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="nameType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="Modules">
<xs:complexType>
<xs:sequence>
<xs:element name="Module" type="moduleType" />
<xs:element name="Name" type="nameType" />
<xs:element name="Level" type="xs:integer" />
<xs:element name="ResourcePerson" minOccurs="1"
maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:element name="FullName" type="xs:string" />
<xs:element name="Name" type="xs:string" />
<xs:element name="Surname" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
尝试按原样验证xml文件,您将看到第一个错误
元素'模块'必须没有元素[children]。
<Module>
元素中包含子元素。 ModuleType
只不过是一个属性为code
在我们确定尝试再次验证之后,我们得到了
属性'shortName'不允许出现在元素'Name'
中
<xs:attribute name="shortname" type="xs:string" />
区分大小写。 shortName != shortname
修正,然后我们得到
从元素
Module
开始发现无效内容。预计会有一个“{ResourcePerson
}”。
为什么我们这样做?好吧,您的Modules
元素只允许某个序列。
<xs:element name="Module">
<xs:element name="Name">
<xs:element name="Level">
<xs:element name="ResourcePerson" maxOccurs="unbounded">
所以你可以只拥有前三个,然后是ResourcePerson
个元素。所以这就是有效的实例文档的样子
<?xml version="1.0" encoding="UTF-8"?>
<Modules>
<Module code="CSE2041" />
<Name shortname="Web 2">Web Technologies II</Name>
<Level>2</Level>
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
<ResourcePerson>
<Surname>Higgins</Surname>
</ResourcePerson>
</Modules>
请注意ResourcePerson
如何只有一个子元素。这是choice
的结果。
现在我不认为这是你期望从你的架构中获得的结果,所以你可能不得不再次尝试它。
但也许你想要更像这样的东西
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="moduleType">
<xs:sequence>
<xs:element name="Name" type="nameType" />
<xs:element name="Level" type="xs:integer" />
<xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:element name="FullName" type="xs:string" />
<xs:element name="Name" type="xs:string" />
<xs:element name="Surname" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="code" type="xs:string" />
</xs:complexType>
<xs:complexType name="nameType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="Modules">
<xs:complexType>
<xs:sequence>
<xs:element name="Module" type="moduleType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您有Module
个元素,其中包含name,level和resource person元素。然后在文档级Modules
中,您有Module
所以这会验证
<?xml version="1.0" encoding="UTF-8"?>
<Modules>
<Module code="CSE2041">
<Name shortname="Web 2">Web Technologies II</Name>
<Level>2</Level>
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
</Module>
<Module code="CSE2041">
<Name shortname="Web 2">Web Technologies II</Name>
<Level>2</Level>
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
</Module>
</Modules>
至于命名问题。您可能只需group
喜欢
<xs:group name="NameGroup">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="SurName" type="xs:string"/>
</xs:sequence>
</xs:group>
然后做
<xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:element name="FullName" type="xs:string" />
<xs:group ref="NameGroup"/>
</xs:choice>
</xs:complexType>
</xs:element>
这样,它可以是FullName
或 group
Name
和SurName
。然后你可以使用ResourcePerson
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
-- or --
<ResourcePerson>
<Name>John</Name>
<SurName>Smith</SurName>
</ResourcePerson>