XSD可以指定元素列表或单个元素作为根吗?

时间:2017-01-25 20:26:08

标签: xml xsd

是否可以创建一个XSD来验证这两个:

<ImageS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/schemas/myschema.xsd">
  <Image>
      <Url>http://www.nowhere.com/nothing.gif</Url>
  </Image>
  <Image>
      <Url>http://www.somewhere.com/somewhere.gif</Url>
  </Image>
</ImageS>

而且:

<Image xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/schemas/myschema.xsd">
    <Url>http://www.yetanotheraddress.com/something.gif</Url>
</Image>

我一直在尝试使用选择元素:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="myImages" 
    targetNamespace="http://example.com/schemas/myschema.xsd"
    elementFormDefault="qualified"
    xmlns="http://example.com/schemas/myschema.xsd"
    xmlns:mstns="http://example.com/schemas/myschema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:choice minOccurs="0">
        <xs:element name="ImageS" type="xs:ImageList" />
        <xs:element name="Image" type="xs:Image" />
    </xs:choice>

    <xs:complexType name="ImageList">
        <xs:sequence>
            <xs:element name="Image" type="Image" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Image">
        <xs:sequence>
        <xs:element name="Url" type="someString"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="someString">
        <xs:restriction base="xs:string">
            <xs:minLength value="0"/>
            <xs:maxLength value="50"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

当我尝试使用它时它似乎不起作用。尝试将xsd添加到C#XmlSchemaSet

时,我不断收到此错误消息
  

XmlSchemaException:'http://www.w3.org/2001/XMLSchema:choice'   在此上下文中不支持元素。

这让我相信我正在做的事情不能以那种方式完成。

是否可以创建一个XSD来定义列表中的项目或只是单个项目?

2 个答案:

答案 0 :(得分:2)

验证基于根元素开始。每个模式可以有多个根,只需删除<xsd:choice元素。

更正了XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="myImages" 
    targetNamespace="http://example.com/schemas/myschema.xsd"
    elementFormDefault="qualified"
    xmlns="http://example.com/schemas/myschema.xsd"
    xmlns:mstns="http://example.com/schemas/myschema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="ImageS" type="ImageList" />
    <xs:element name="Image" type="Image" />

    <xs:complexType name="ImageList">
        <xs:sequence>
            <xs:element name="Image" type="Image" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Image">
        <xs:sequence>
        <xs:element name="Url" type="someString"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="someString">
        <xs:restriction base="xs:string">
            <xs:minLength value="0"/>
            <xs:maxLength value="50"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

您还遇到错误,因为为ImageSImage元素指定的类型分别为xs:ImageListxs:Image。这意味着这些类型生活在http://www.w3.org/2001/XMLSchema而不是您的架构中。删除要修复的xs:

答案 1 :(得分:0)

架构未定义文档的根元素。每个全局元素声明都定义了潜在的验证根。换句话说,架构定义了有效的元素,而不是有效的文档。所以你不需要说root可以是Image或ImageS,这是真的,你不需要说什么。