如何为此 XML 编写一个 XML 架构 (XSD)?

How to write an XML Schema (XSD) for this XML?

架构规则:

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 的练习:调整它以满足给定的 架构规则