0

次の XML があります。

<dict >
  <key>key1</key>
  <string>bla-bla</string>

  <key>key2</key>
  <int>123</int>

  <key>key3</key>
  <string>blah-blah</string>

   <!-- key... -->
   <!-- string or int tag -->
   <!-- the pair repeats several times -->
</dict>

このファイル構造の XSD を作成しようとしていますが、現在、次のコードを使用しています。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Test"
    targetNamespace="http://tempuri.org/Test.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/Test.xsd"
    xmlns:mstns="http://tempuri.org/Test.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name ="objectType">
  </xs:complexType>

  <xs:complexType name ="stringType" >
    <xs:complexContent>
      <xs:extension base ="objectType">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name ="intType">
    <xs:complexContent>
      <xs:extension base ="objectType">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name ="dictType">
    <xs:sequence minOccurs ="0" maxOccurs ="unbounded">
      <xs:element type ="xs:string" name ="key"/>
      <xs:element ref ="object" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name ="object" type ="objectType" abstract ="true"/>
  <xs:element name ="string" type ="stringType" substitutionGroup="object" />
  <xs:element name ="int" type ="intType" substitutionGroup="object"/>

  <xs:element name ="dict" type ="dictType" />

</xs:schema>

このスキーマにより、次の xml を生成できます

<?xml version="1.0" encoding="utf-8"?>
<dict xmlns="http://tempuri.org/Test.xsd">
  <key>key1</key>
  <string />
  <key>key2</key>
  <string />
  <key>key3</key>
  <int />
</dict>

<int>この段階では、タグとタグを使用してデータを提供する方法が見つかりません<string>。のようなものを書いているとき<int>1</int>。エラーメッセージが表示されます。「要素にテキストを含めることはできません。コンテンツ モデルが空です」

<int>タグのコンテンツを整数で、<string>タグのコンテンツを文字列で完全に埋めることができるかどうか教えてください。どうやって?

前もって感謝します!

4

2 に答える 2

1

既存または新しい XML の XSD を設計しますか。新しいノードを設計する場合は、エントリ ノードも定義することを検討します。これにより、構造を定義しやすくなり、生成されたクラスも改善されると思います。

<dict>
  <entry>
    <key>key1</key>
    <string>bla-bla</string>
  </entry>
  <entry>
    <key>key2</key>
    <int>123</int>
  </entry>
  <entry>
    <key>key3</key>
    <string>blah-blah</string>
  </entry>
</dict>

編集:私の提案するXSDは次のようになります:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://yaugen.com/schemas" xmlns:yaugen="http://yaugen.com/schemas" elementFormDefault="qualified">
    <xs:element name="dict">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="entry" maxOccurs="unbounded" minOccurs="0" type="yaugen:Entry">
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:complexType name="Entry">
        <xs:sequence>
            <xs:element type="xs:string" name="key"/>
            <xs:choice>
                <xs:element type="xs:string" name="string" />
                <xs:element type="xs:byte" name="int" />
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
于 2013-08-23T06:00:15.053 に答える
0

string 要素と int 要素を複合型として定義しようとしましたが、その理由がわかりません。明らかなことは、定義することです

<xs:element name="string" type="xs:string" substitutionGroup="object"/>
<xs:element name="int" type="xs:int" substitutionGroup="object"/>

ただし、これが機能するには、オブジェクトがタイプ xs:anyType で定義されている必要があります。

于 2013-08-23T09:03:34.207 に答える