如何为此 XML 编写一个 XML 架构 (XSD)?
How to write an XML Schema (XSD) for this XML?
架构规则:
- 四大满贯元素
- 比分为四盘抢七;最后一套应该迎合
7-5(与当年澳大利亚的情况一样)。
- winner 和 runnerUp 是字符串;第一个字母是大写字母,
后跟小写字母
- 表面是粘土、反弹王牌、草地或硬地球场之一
- 名称是澳大利亚、法网、温网或美网之一
- 两名半决赛选手,均为字符串;第一个字母是大写字母,
后跟小写字母
- 年份是正确的架构年份类型(不是字符串)
XML
<?xml version="1.0"?>
<Slams ...>
<slam name="Australia" year="2012">
<winner>Djokovic</winner>
<runnerUp>Nadal</runnerUp>
<score>5-76-46-26-77-5</score>
<surface>Rebound Ace</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Murray</semiFinalist>
</slam>
<slam name="French Open" year="2012">
<winner>Nadal</winner>
<runnerUp>Djokovic</runnerUp>
<score>6-46-32-67-5</score>
<surface>Clay</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
<slam name="Wimbledon" year="2012">
<winner>Federer</winner>
<runnerUp>Murray</runnerUp>
<score>4-67-56-36-4</score>
<surface>Grass</surface>
<semiFinalist>Djokovic</semiFinalist>
<semiFinalist>Tsonga</semiFinalist>
</slam>
<slam name="US Open" year="2012">
<winner>Murray</winner>
<runnerUp>Djokovic</runnerUp>
<score>7-67-52-63-66-2</score>
<surface>Hard Court</surface>
<semiFinalist>Berdych</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
</Slams>
XSD
这是我目前得到的,但我不确定它是否正确。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="Australia">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="French Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Wimbledon">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="US Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
元素名称是标签的名称:在您的情况下
您将其与属性名称
的值混淆了
要解决的问题:
#1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
至
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
#2
定义单个 slam
元素,具有 name
属性,而不是为每个此类命名可能性定义不同的元素。还要添加一个 year
属性。
#3
您的 XML(就您所显示的而言)不使用命名空间,因此请从您的 XSD xs:schema
元素中删除这些行:
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
#4
将 slam
元素放在 Slams
元素声明中,并使用 maxOccurs="unbounded"
。使用 maxOccurs="2"
(或 3 或 unbounded
)作为 semiFinalist
而不是在 slam
.
中重复元素声明
一共:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Slams">
<xs:complexType>
<xs:sequence>
<xs:element name="slam" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="year" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这将为您提供一个 XSD 来验证您的 XML。
留作 reader 的练习:调整它以满足给定的 架构规则 。
架构规则:
- 四大满贯元素
- 比分为四盘抢七;最后一套应该迎合 7-5(与当年澳大利亚的情况一样)。
- winner 和 runnerUp 是字符串;第一个字母是大写字母, 后跟小写字母
- 表面是粘土、反弹王牌、草地或硬地球场之一
- 名称是澳大利亚、法网、温网或美网之一
- 两名半决赛选手,均为字符串;第一个字母是大写字母, 后跟小写字母
- 年份是正确的架构年份类型(不是字符串)
XML
<?xml version="1.0"?>
<Slams ...>
<slam name="Australia" year="2012">
<winner>Djokovic</winner>
<runnerUp>Nadal</runnerUp>
<score>5-76-46-26-77-5</score>
<surface>Rebound Ace</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Murray</semiFinalist>
</slam>
<slam name="French Open" year="2012">
<winner>Nadal</winner>
<runnerUp>Djokovic</runnerUp>
<score>6-46-32-67-5</score>
<surface>Clay</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
<slam name="Wimbledon" year="2012">
<winner>Federer</winner>
<runnerUp>Murray</runnerUp>
<score>4-67-56-36-4</score>
<surface>Grass</surface>
<semiFinalist>Djokovic</semiFinalist>
<semiFinalist>Tsonga</semiFinalist>
</slam>
<slam name="US Open" year="2012">
<winner>Murray</winner>
<runnerUp>Djokovic</runnerUp>
<score>7-67-52-63-66-2</score>
<surface>Hard Court</surface>
<semiFinalist>Berdych</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
</Slams>
XSD
这是我目前得到的,但我不确定它是否正确。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="Australia">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="French Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Wimbledon">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="US Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
元素名称是标签的名称:在您的情况下 您将其与属性名称
的值混淆了要解决的问题:
#1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
至
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
#2
定义单个 slam
元素,具有 name
属性,而不是为每个此类命名可能性定义不同的元素。还要添加一个 year
属性。
#3
您的 XML(就您所显示的而言)不使用命名空间,因此请从您的 XSD xs:schema
元素中删除这些行:
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
#4
将 slam
元素放在 Slams
元素声明中,并使用 maxOccurs="unbounded"
。使用 maxOccurs="2"
(或 3 或 unbounded
)作为 semiFinalist
而不是在 slam
.
一共:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Slams">
<xs:complexType>
<xs:sequence>
<xs:element name="slam" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="year" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这将为您提供一个 XSD 来验证您的 XML。
留作 reader 的练习:调整它以满足给定的 架构规则 。