随机顺序和 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_id
和picked
迁移到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 的元素的主要内容,如果未能解决你的问题,请参考以下文章