草庐IT

XSD 指示器

runoob 2023-04-07 原文

XSD 指示器


通过指示器,我们可以控制在文档中使用元素的方式。


指示器

有七种指示器:

Order 指示器:

  • All
  • Choice
  • Sequence

Occurrence 指示器:

  • maxOccurs
  • minOccurs

Group 指示器:

  • Group name
  • attributeGroup name

Order 指示器

Order 指示器用于定义元素的顺序。

All 指示器

<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

注意: 当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1(稍后将讲解 <minOccurs> 以及 <maxOccurs>)。

Choice 指示器

<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

Sequence 指示器

<sequence> 规定子元素必须按照特定的顺序出现:

<xs:element name="person">
   <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>


Occurrence 指示器

Occurrence 指示器用于定义某个元素出现的频率。

注意: 对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。

maxOccurs 指示器

<maxOccurs> 指示器可规定某个元素可出现的最大次数:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的例子表明,子元素 "child_name" 可在 "person" 元素中最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。

minOccurs 指示器

<minOccurs> 指示器可规定某个元素能够出现的最小次数:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的例子表明,子元素 "child_name" 可在 "person" 元素中出现最少 0 次,最多出现 10 次。

提示:如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明:

一个实际的例子:

名为 "Myfamily.xml" 的 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">

<person>
  <full_name>Hege Refsnes</full_name>
  <child_name>Cecilie</child_name>
</person>

<person>
  <full_name>Tove Refsnes</full_name>
  <child_name>Hege</child_name>
  <child_name>Stale</child_name>
  <child_name>Jim</child_name>
  <child_name>Borge</child_name>
</person>

<person>
  <full_name>Stale Refsnes</full_name>
</person>

</persons>

上面这个 XML 文件含有一个名为 "persons" 的根元素。在这个根元素内部,我们定义了三个 "person" 元素。每个 "person" 元素必须含有一个 "full_name" 元素,同时它可以包含多至 5 个 "child_name" 元素。

这是schema文件"family.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">

<xs:element name="persons">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="full_name" type="xs:string"/>
            <xs:element name="child_name" type="xs:string"
            minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>


Group 指示器

Group 指示器用于定义相关的数批元素。

元素组

元素组通过 group 声明进行定义:

<xs:group name="groupname">
...
</xs:group>

您必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 "persongroup" 的 group,它定义了必须按照精确的顺序出现的一组元素:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

在您把 group 定义完毕以后,就可以在另一个定义中引用它了:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

属性组

属性组通过 attributeGroup 声明来进行定义:

<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>

下面这个例子定义了名为 "personattrgroup" 的一个属性组:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

在您已定义完毕属性组之后,就可以在另一个定义中引用它了,就像这样:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>

有关XSD 指示器的更多相关文章

  1. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  2. ruby - 如何通过 Rubocop 指示打开 & :read as argument to File. - 2

    我有这个代码File.open(file_name,'r'){|file|file.read}但是Rubocop发出警告:Offenses:Style/SymbolProc:Pass&:readasargumenttoopeninsteadofablock.你是怎么做到的? 最佳答案 我刚刚创建了一个名为“t.txt”的文件,其中包含“Hello,World\n”。我们可以按如下方式阅读。File.open('t.txt','r',&:read)#=>"Hello,World\n"顺便说一下,由于第二个参数的默认值是'r',所以这样

  3. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  4. ruby - Ruby 中的 XSD 模式验证 - 2

    我找到了几个关于如何根据模式验证xml文档的来源,但我有一个ruby​​应用程序,我需要在其中验证用户提供的模式本身是否是有效的模式。有没有办法让我检查这个?是否有用于验证XSD架构的XSD架构?或者是否有图书馆或gem可以为我做到这一点? 最佳答案 您可以使用Nokogiri为此:beginschema=Nokogiri::XML::Schema(File.read('invalid_schema.xsd'))rescueNokogiri::XML::SyntaxError=>eputs"InvalidXMLSchema!"end

  5. ruby - (Watir webdriver) 在 OSX 10.9 中使用多显示器时如何将浏览器移动到另一个屏幕 - 2

    我知道有一个名为browser.window.move_to(0,0)的函数可以将浏览器移动到不同的位置,但OSX10.9对它来说是全新的。有什么方法可以将浏览器移动到另一个桌面吗?例如。在“桌面2”中触发命令的控制台,但我希望浏览器出现在“桌面1”中。非常感谢! 最佳答案 哈,在我尝试这个之前我正要说这可能是不可能的:browser.window.move_to(-1200,0)我的第二台显示器位于主屏幕的左侧。有效。好问题。您需要花点时间才能正确使用它,但watir似乎能够使用整个显示器Canvas。例如,如果您的显示器位于主屏

  6. ruby - Net::HTTP 中的服务器名称指示支持? - 2

    我正在尝试让Ruby的Net::HTTP实现与SNI一起工作。mail.google.com和gmail.com都位于同一个IP地址上,因此当通过SSL连接时,Google服务器需要知道要使用哪个证书。默认情况下,它会返回mail.google.com证书,如果您尝试实现WebFinger,这就是一个问题。WebFinger要求您检索https://gmail.com/.well-known/host-meta以获取LRDD信息,但是,出于安全原因,验证SSL证书至关重要信息。由于Google在这种情况下提供默认的mail.google.com证书,因此SSLpost_connecti

  7. ruby - 从 XSD 生成 Ruby 类 - 2

    有没有一种方法可以从XSD生成Ruby类(甚至可能是ActiveResource类),以便它们包含一种将类序列化为对初始XSD有效的xml的方法?我知道soap4r有xsd2ruby,但生成的ruby​​类似乎不能轻易序列化为xml。 最佳答案 无耻的self推销(希望这在stackoverflow上没问题)但我正在开发一个开源项目来做that它仍在进行中(请随时发送补丁),但最终目标是将XSD与Ruby类相互转换(现在正在这样做),并将符合该XSD的XML与这些类的实例相互转换。 关于

  8. ruby - 我如何指示 Capistrano 3 加载我在远程主机上设置的 shell 环境变量? - 2

    我想指示Capistrano加载在远程服务器上定义的环境变量。我该怎么做?似乎当我在.bashrc文件中导出我的环境变量时,Capistrano没有考虑它们。Capistrano似乎正在执行/usr/bin/env来创建执行远程命令的环境,但这似乎并没有从.bashrc加载环境变量。我还要告诉你,我也在使用rvm-capistrano(以防万一它可能有帮助)。有什么线索吗? 最佳答案 Capistrano实际上确实加载.bashrc。但在文件顶部附近,您会发现以下行之一:#Ifnotrunninginteractively,don'

  9. 用于使用 xsd :import 使用 Web 服务 wsdl 的 Ruby gem - 2

    我们需要使用一个web服务,它有一个使用xsd:import进行数据类型定义的WSDL。savongem不支持,因为它使用芥末。我们正在使用Ruby1.9.2你能给我推荐一些gem吗?问候苏伦丹 最佳答案 不幸的是,似乎没有任何Gem可以满足您的需求。我对这种情况的建议:使用SoapUI检查Web服务使用Savon编写您的客户端http://savonrb.com我已经这样做过好几次了,这里有很多人可以帮助您采用这种方法。 关于用于使用xsd:import使用Web服务wsdl的Ruby

  10. ruby-on-rails - Ruby/Rails 循环中的魔术第一个和最后一个指示器? - 2

    Ruby/Rails在涉及基本事物的sugar时做了很多很酷的事情,我认为有一个非常常见的场景,我想知道是否有人做过帮助或类似的事情。a=Array.new(5,1)a.each_with_indexdo|x,i|ifi==0printx+1elsifi==(a.length-1)printx*10elseprintxendend请原谅丑陋,但这达到了人们可能想要的......有没有一种ruby方法可以对循环的第一个和最后一个做一些事情?[编辑]我认为理想情况下,这将是带有参数(数组实例、所有元素函数、第一个元素函数、最后一个元素函数)的Array的扩展......但我愿意其他想法。

随机推荐