xsd中的元素可以有任意名称吗?

时间:2012-03-09 08:08:19

标签: xml xsd

我是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中可行吗?验证新的任意命名节点?

3 个答案:

答案 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文档中定义架构时,只需更改超级跑车的名称即可。 我没有测试过这个,但它应该让你知道如何实现你想要做的事情。