あなたが言及した要件は、XSDでは達成できません。XSD 開発者として、あなたの質問を読んで理解したのは、ノードの名前ではなく、ノードの下の階層とデータを検証したいということです。そのため、さまざまな受信 XML に対して同じ XSD を維持したいと考えています。
良い。これに対する完璧な解決策が見つからないかもしれません..しかし、興味があれば回避策があります。しかし、これには、可能な名前を知る必要があります..
<Choice/>
XSD には、複数の可能なノードの中から 1 つを検証できるオプションがあります。検証は、ノードの名前ではなく、階層とデータに焦点を当てます。
下記の XML サンプルには、AppleFruit または Orange fruit の定義があります。タグ名は異なりますが、階層とデータ型は同じです。
<?xml version="1.0" encoding="utf-8"?>
<root>
<AppleTree>
<AppleFruitColor>Red</AppleFruitColor>
<AppleFruitShape>Heart</AppleFruitShape>
<Tastes>Sweet</Tastes>
<Price>$1</Price>
</AppleTree>
<AppleTree>
<AppleFruitColor>Green</AppleFruitColor>
<AppleFruitShape>Heart</AppleFruitShape>
<Tastes>Sweet and Sour</Tastes>
<Price>$0.5</Price>
</AppleTree>
</root>
2 番目の XML:
<root>
<OrangeTree>
<OrangeFruitColor>Orange</OrangeFruitColor>
<OrangeFruitShape>Round</OrangeFruitShape>
<Tastes>Sweet and Sour</Tastes>
<Price>$0.5</Price>
</OrangeTree>
</root>
関連する XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="root"/>
<xs:complexType name="root">
<xs:sequence>
<xs:choice>
<xs:element maxOccurs="unbounded" name="AppleTree" type="Tree"/>
<xs:element maxOccurs="unbounded" name="OrangeTree" type="Tree"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Tree">
<xs:sequence>
<xs:choice>
<xs:element name="AppleFruitColor" type="FruitCOLOR" />
<xs:element name="OrangeFruitColor" type="FruitCOLOR" />
</xs:choice>
<xs:choice>
<xs:element name="AppleFruitShape" type="xs:string" />
<xs:element name="OrangeFruitShape" type="xs:string" />
</xs:choice>
<xs:element name="Tastes" type="xs:string" />
<xs:element name="Price" type="xs:string" />
</xs:sequence>
</xs:complexType>
<!--Custom Data Types-->
<xs:simpleType name="FruitCOLOR">
<xs:restriction base="xs:string">
<xs:enumeration value="Red"/>
<xs:enumeration value="Green"/>
<xs:enumeration value="Orange"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
注: 要素ごとに個別の ComplexTypes/SimpleTypes を定義できます (たとえば、complexType "Tree" を再利用している場合とは異なります)。
説明:
上記の XSD では、ルート要素に AppleTree または OrangeTree、あるいはその両方が含まれている可能性があります。ComplexType ツリーの次のレベルは、AppleTree/OrangeTree の下のノードを検証します。
たとえば、AppleFruitColor または OrangeFruitColor は、「赤または緑またはオレンジ」以外のデータを持たない可能性があります。 .. XSD は柔軟であるため、AppleTree の下で OrangeFruitColor を受け入れることができます。つまり、どのノードが AppleTree の下に来るかは気にしませんが、それが持つ果物の色は気にします!!
上記の例では、Apple と Orange の両方に個別の Fruit 色を定義できます。
<xs:complexType name="Tree">
<xs:sequence>
<xs:choice>
<xs:element name="AppleFruitColor" type="AppleCOLOR" />
<xs:element name="OrangeFruitColor" type="OrangeCOLOR" />
</xs:choice>
........
......
<xs:simpleType name="AppleCOLOR">
<xs:restriction base="xs:string">
<xs:enumeration value="Red"/>
<xs:enumeration value="Green"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="OrangeCOLOR">
<xs:restriction base="xs:string">
<xs:enumeration value="Orange"/>
</xs:restriction>
</xs:simpleType>
このコードでは、スキーマは<OrangeFruitColor>
オレンジ色のみを受け入れ、<AppleFriutColor>
赤または緑のいずれかになります。
検証は、ノードの名前ではなく、階層とデータに焦点を当てています。