随机顺序和 maxOccurs > 1 的元素

Posted

技术标签:

【中文标题】随机顺序和 maxOccurs > 1 的元素【英文标题】:Elements in random order and maxOccurs > 1 【发布时间】:2016-06-15 08:25:47 【问题描述】:

我需要创建一个 XSD 1.0 来验证 XML 文件。

验证将使用 python 中的 lxml.etree,此工具仅支持 XML Schema 1.0 (lxml with schema 1.1)

我需要使用的结构是类型:

    item
    | owners*
    | config+
    | | config_id
    | | tests*
    | | picked?
    | | capability*
    | | | name
    | | | value

使用的符号是:

* 元素可以出现零次或多次。 + 元素可以出现一次或多次。 ? 该元素是可选的。

config 标签中的元素可以是任意顺序,这意味着我不能使用<sequence> 指示符。 <all> 指标给了我随机顺序,但在这种情况下,maxOccurs 是 1。<choice> 指标和maxOccurs="unbounded" 会给我随机顺序和元素的倍数,但不会有下限对于元素。

我的 XSD 文件如下所示:

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

<!--Schema version: 1.0, date: 29-02-2016-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- definition of complex types -->    
  <xs:complexType name="capability_type">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="value" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="config_type">
    <xs:all>
      <xs:element name="config_id" type="xs:string" />
      <xs:element name="tests" type="xs:string" minOccurs="0" 
                          maxOccurs="unbounded" />
      <xs:element name="picked" type="xs:string" minOccurs="0" />
      <xs:element name="capability" type="capability_type" 
                          minOccurs="0" maxOccurs="unbounded" />
    </xs:all>
  </xs:complexType>

  <xs:complexType name="item_type">
    <xs:sequence>
      <xs:element name="owners" type="xs:string" minOccurs="0" 
                          maxOccurs="unbounded" />
      <xs:element name="config" type="config_type" minOccurs="1" 
                          maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <!-- definition of schema -->
  <xs:element name="item" type="item_type" />

</xs:schema>

使用此架构我收到错误:

元素元素:模式解析器错误:元素 'http://www.w3.org/2001/XMLSchemaelement':无效值 maxOccurs(必须为 0 或 1)。

我的问题有什么替代方案吗?

【问题讨论】:

替代方法:在制作模式时,我几乎总是使用模式生成器,我将其提供给我提出的最终 XML。我使用我在 .NET 中编写的一个简单工具,但它们也在网上流传,例如:xml.mherman.org ... 绝对必须仔细检查输出。而且那些在线工具有时完全是垃圾。 【参考方案1】:

是的,还有其他选择:

    完全放弃随机订单要求。这往往比它的价值更麻烦。 通过将config_idpicked 迁移到xs:all 之外以及将maxOccurs="unbounded"xs:all 的子代迁移到xs:all 本身来部分放弃随机顺序要求。 保持随机顺序要求,将 maxOccurs="unbounded" 迁移到 xs:all,并使用 XSD 1.1 断言来强制执行其他出现约束。

【讨论】:

你知道 Linux 中任何免费的 XSD 1.1 验证器吗? 见Linux command line tool validating XSD 1.1?

以上是关于随机顺序和 maxOccurs > 1 的元素的主要内容,如果未能解决你的问题,请参考以下文章

XmlSerializer 生成错误顺序的重复序列

python 生成包含100个两位数随机整数的元组

数据结构:链表链队列

求Lua 的元表的算术类的元方法例子(加、减、乘、除等等) ,详细的例子

jQuery,随机 div 顺序

允许XSD架构中元素的随机顺序