我是xsd验证的新手,我正在尝试验证选择标记是否具有特定的元素组,但也包含任意命名的元素。如下所示:
...
<xs:choice>
<xs:element name="test1" type="xs:string" />
<xs:element name="test2" type="xs:string" />
<xs:element name="-some regex or something to specify arbitrary name here" type="xs:string" />
</xs:choice>
...
XML:
...
<test1>example text</test1>
<test2>example text again</test2>
<exampleNode>example text</exampleNode>
...
这在xsd中可行吗?验证新的任意命名节点?
答案 0 :(得分:5)
您可以使用xs:any通配符来允许任何元素名称或特定名称空间集合中的任何名称。您不能进一步限制名称(除非在XSD 1.1中使用断言)。
使用具有内部结构的名称(例如地址行-1,地址行-2,地址行-3)在XML设计中总是不好的做法。在这种情况下,更好的设计是<address-line nr="1">
等等。因此,允许与某些正则表达式匹配的名称的想法表明设计不佳。一般而言,XML Schema的设计使得为设计不佳的词汇表编写模式变得困难或不可能。
答案 1 :(得分:2)
试试这个:minOccurs="0"
使其成为非强制性的。
<xs:choice>
<xs:element name="test1" type="xs:string" />
<xs:element name="test2" type="xs:string" />
<xs:any minOccurs="0"/>
</xs:choice>
答案 2 :(得分:0)
它应该使用实体引用: 架构:
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:element name="Ferrari"/>
<xsd:element name="Lambo"/>
<xsd:element name="&supercar;"/>
</xsd:schema>
XML文档:
<?xml version="1.0"?>
<!DOCTYPE xsd:schema PUBLIC "-//W3C//DTD XML Schema 20000406//EN" "XMLSchema.dtd" [ <!ENTITY % p 'xsd:'> <!ENTITY % s ':xsd'>
<!ENTITY supercar 'McLaren'>
]>
要更改动态名称,在XML文档中定义架构时,只需更改超级跑车的名称即可。 我没有测试过这个,但它应该让你知道如何实现你想要做的事情。