我有一个复杂的元素:
<mytype>
<key1>required</key1>
<key2>optional</key2>
<anyotherkey>whatever type value</anyotherkey>
</mytype>
基本上,我有一个带有必需键(key1),可选键(key2)和其他键的元素,我不在乎。如何编写有效的xsd?
<xs:all>
只能验证(key1 + key2),但不能验证“anyotherkey”,因为“anyotherkey”的名称可以是任何名称。
<xs:any>
<xs:sequence>
中的<mytype>
<key3>key3 value</key3>
<key1>key1 value</key1>
<key2>key2 value</key2>
</mytype>
看起来很有希望,但问题是“任何其他键”可以按任何顺序排列。我不想要一个特定的序列。对于下面的例子,它仍然是一个有效的数据:
df.columns.str.startswith
答案 0 :(得分:0)
xs:any
内无xs:all
。此外,如果要将xs:any
与xs:element
放在一起,则必须为 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://ns-main">
<xs:complexType name="register">
<xs:choice maxOccurs="unbounded">
<xs:element name="key1" type="xs:string"/>
<xs:element name="key2" type="xs:string" minOccurs="0"/>
<xs:any namespace="http://ns-opt" processContents="lax"/>
</xs:choice>
</xs:complexType>
</xs:schema>
选择一个(不同的)命名空间。
在我看来,最实用的方法是使用限制较少的XML Schema并在解析后添加进一步的健全性检查(例如,Java,Schematron,...):
processContents='lax'
请注意,您可能希望xs:any
为xs:any
,否则XML解析器必须在运行时知道<main:test xmlns:main="http://ns-main" xmlns:opt="http://ns-opt">
<main:key2>test</main:key2>
<opt:key3>test</opt:key3>
<main:key1>test</main:key1>
</main:test>
的所有元素的架构定义。
允许你这样的实例(假设main:test的类型为main:register)。
<xs:complexType name="register">
<xs:sequence>
<xs:any namespace="##any" processContents="lax" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
如果您无法更改数据的命名空间,我担心没有其他XML架构
{{1}}