0

次のような XML ファイルが与えられた場合

<stuff>
 <noidea>
  <name>x</name>
  <type>a</type>
 </noidea>
 <whatthesethings>
  <name>y</name>
  <type>n</type>
 </whatthesethings>
 <mightbenamed>
  <name>z</name>
  <type>c</type>
 </mightbenamed>
</stuff>

この例では、各要素の子が何であるかを知っており、それらの名前があるため、XSD を記述できますが、実際には、要素には任意の名前を付けることができます。だから、私は次のようなものが必要です

<xs:element name="stuff">
 <xs:complexType>
  <xs:sequence>
   <xs:element !!!unknownName!!! minOccurs="1" maxOccurs="unbounded">
    <xs:complexType>
     <xs:element name="name" type="xs:string" />
     <xs:element name="type" type="xs:string" />
    </xs:complexType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>

質問 943659では、<xs:any/>言及されていますが、検証可能な拡張ベースとして使用できるとは思いません。

これを XSD で行うことは可能ですか (そうであれば、例を示していただければ幸いです)、それともサンプル ドキュメントはそもそも XML の悪用ですか?

注: これは私の XML ファイルではありません。定義された要素名を確実にするために変更することはできません。

4

1 に答える 1

1

あなたが言及した要件は、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>赤または緑のいずれかになります。

検証は、ノードの名前ではなく、階層とデータに焦点を当てています。

于 2012-10-03T15:02:32.123 に答える