如何为这个XML编写XML Schema(XSD)?

时间:2016-08-26 16:41:14

标签: xml xsd schema xsd-validation xml-validation

架构规则:

  • 四个大满贯元素
  • 得分有四个抢七局;最后一组应该迎合 7-5(与当年澳大利亚的情况一样)。
  • 获胜者和runnerUp是字符串;第一个字母是大写字母, 后跟小写字母
  • 表面是Clay,Rebound Ace,Grass或Hard Court之一
  • 名称是澳大利亚,法国公开赛,温布尔登或美国公开赛之一
  • 两个半决赛选手,两个弦乐;第一个字母是大写字母, 后跟小写字母
  • year是一个正确的架构年份类型(不是字符串)

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>

2 个答案:

答案 0 :(得分:1)

要解决的问题:

<强>#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"使用unbounded(或3或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>

这将为您提供验证XML的XSD。

留给读者练习:调整它以满足给定的架构规则

答案 1 :(得分:0)

元素名称是标签的名称:在您的情况下 您将它与属性名称

的值混淆