3

このXSDに対していくつかのXMLを検証しています:

  <xs:element name="Composite">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="HeldCurrency" type="mstns:HeldCurrencyType"  nillable="true"/>
        <xs:element name="Component" type="mstns:ComponentType" nillable="true" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute  name="Type" type="mstns:compositeType" use="required"/>
    </xs:complexType>x
  </xs:element>

  <xs:complexType name="HeldCurrencyType">
    <xs:attribute  name="CashPerCreationUnit" type="xs:double" />
    <xs:attribute  name="CashCurrency" type="xs:string" />
    <xs:attribute  name="ClosingSpotFx" type="xs:double" />
  </xs:complexType>

  <xs:complexType name="ComponentType">
    <xs:choice>
      <xs:element name="Weight" type="xs:double"/>
      <xs:element name="Units" type="xs:int"/>
    </xs:choice>
    <xs:attribute name="Symbol" type="xs:string" />
  </xs:complexType>

  <xs:simpleType name="compositeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Index" />
      <xs:enumeration value="Etf" />
    </xs:restriction>
  </xs:simpleType>

それに対して次のXMLを実行すると:

<?xml version="1.0"?>
<Composite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Type="Etf" xmlns="urn:xxx-au:index-types">
  <HeldCurrency />
  <Component />
</Composite>

これをC#/。Net4.0で次のコードを使用して実行します。

using (FileStream fileStream = File.OpenRead("./Xml/Components.xsd"))
{
    using (var schemaReader = new XmlTextReader(fileStream))
    {
        settings.Schemas.Add(null, schemaReader);
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += OnValidationEventHandler;

        using (FileStream infile = File.OpenRead(filename))
        {
            using(var xmlReader = XmlReader.Create(infile,settings))
            {
                var serialiser = new XmlSerializer(typeof (Composite));
                _composite = (Composite) serialiser.Deserialize(xmlReader);
            }
        }
    }
}

次のエラーが発生します:名前空間'urn:xxx-au:index-types'の要素'Component'のコンテンツが不完全です。予想される可能な要素のリスト:名前空間の「重量、単位」。しかし、私はminOccurs = "0"を持っているのに、なぜこれが問題になるのでしょうか?結局のところ、シーケンスにComponentType要素が含まれていないことは合法ですよね?

前もって感謝します。

4

2 に答える 2

1

要素ComponentのminOccursは0、子要素ではありません。

だからこれを試してみてください:

  <xs:complexType name="ComponentType">
    <xs:choice>
      <xs:element name="Weight" type="xs:double" minOccurs="0"/>
      <xs:element name="Units" type="xs:int" minOccurs="0"/>
    </xs:choice>
    <xs:attribute name="Symbol" type="xs:string" use="optional"/>
  </xs:complexType>

ここで、ウェイトとユニットの発生を「0」として定義し、属性もオプションにしました。

于 2012-12-19T06:27:34.030 に答える
0
<xs:element name="Component" type="mstns:ComponentType" nillable="true" minOccurs="0"/>

これminOccursは特に「コンポーネント」要素のためのものであり、その内容ではありません。ComponentTypeにはのコンテンツがありますが、のコンテンツはありxs:choiceません。したがって、「コンポーネント」は完全に省略できますが、その内容は省略できません。minOccurs0

于 2012-12-19T06:27:48.590 に答える