2012-03-09 4 views
2

私は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で、このことは可能ですか?任意の名前の新しいノードに対して検証するには?

答えて

5

xs:anyワイルドカードを使用して、要素名または特定の名前空間セット内の任意の名前を使用できます。名前をさらに制限することはできません(XSD 1.1のアサーションを使用する場合を除く)。

内部構造(address-line-1、address-line-2、address-line-3など)を持つ名前を使用することは、XML設計において常に悪い習慣です。この場合、より良いデザインは<address-line nr="1">などです。したがって、正規表現に一致する名前を許可するという考え方は、設計が貧弱であることを示しています。一般に、XMLスキーマは、あまり設計されていない語彙のスキーマを書くのを困難または不可能にするように設計されています。

+0

私が扱っているこのxmlは間違いなく貧しいデザインです。私はそれをお伝えします。 – Slamice

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文書内のスキーマを定義するとき、あなたの動的な名前を変更するには、単に変更スーパーカーの名前。 私はこれをテストしていませんでしたが、あなたがしようとしていることを達成するためのアイデアを提供する必要があります。

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> 
関連する問題