2

xsd スキーマの別のアセンブリで定義された複合型を使用する必要があります。私の .xsd スキーマは両方とも埋め込みリソースとして定義されており、アセンブリにインポートする必要があるシートをリンクしようとしましたが、結果はありません。

基本的に、xml ページの 1 つを検証する必要がある場合、この関数を呼び出しますが、操作内の型の xml スキーマ セットをカスケードに追加することはできません。

public static XmlSchema GetDocumentSchema(this Document doc)
{
    var actualType = doc.GetType();
    var stream = actualType.Assembly.GetManifestResourceStream(actualType.FullName);

    if (stream == null)
    {
        throw new FileNotFoundException("Unable to load the embedded file [" + actualType.FullName + "]");
    }

    var documentSchema = XmlSchema.Read(stream, null);

    foreach (XmlSchemaExternal xmlInclude in documentSchema.Includes)
    {
        var includeStream = xmlInclude.SchemaLocation != "Operations.xsd" 
            ? actualType.Assembly.GetManifestResourceStream(xmlInclude.Id) 
            : typeof (Operations).Assembly.GetManifestResourceStream(xmlInclude.Id);

        if (includeStream == null)
        {
            throw new FileNotFoundException("Unable to load the embedded include file [" + xmlInclude.Id + "]");
        }

        xmlInclude.Schema = XmlSchema.Read(includeStream, null); 
    }

    return documentSchema;
}

これは主なスキーマです:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ExampleSheet"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include id="Operations" schemaLocation="Operations.xsd"/>
  <xs:element name="ExampleSheet">
    <xs:complexType>
      <xs:sequence>
      <xs:element name="Operations" type="Operations"/>
    </xs:sequence>
    <xs:attribute name="version" type="xs:string" use="required"/>
  </xs:complexType>
  </xs:element>
</xs:schema>    

そして、これはオペレーションのスキーマです:

<xs:schema id="Operations"    
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="Operations" type="Operations"/>
  <xs:complexType name="Operations">
    <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element name="Insert" type="Insert"/>
      <xs:element name="InsertUpdate" type="InsertUpdate"/>
      <xs:element name="Update" type="Update"/>
      <xs:element name="Delete" type="Delete"/>
    </xs:choice>
    <xs:attribute name="version" type="xs:string" use="required"/>
    <xs:attribute name="store" type="xs:string" use="required"/>
    <xs:attribute name="chain" type="xs:string" use="optional"/>
  </xs:complexType>
</xs:schema>

たとえば、挿入のある ExampleSheet がある場合、それを認識できません。Operations と Insert は IXmlSerializable を実装するクラスで、最初のクラスはカスタム XmlSchemaProvider を使用して内部型のスキーマ セットを取得します。

私は何か間違ったことをしていますか?ExampleSheet が Operations のメンバーにアクセスできるようにするにはどうすればよいですか? 必要に応じてリーダーとライターを構築できるように、ExampleSheet に IXmlSerializable を実装する必要がありますか?スキーマは引き続き役立ちますか?

4

1 に答える 1

2

の代わりに、クラス XmlSchemaを調べましたか?XmlSchemaSet

私は XML シリアライゼーションで多くのことをしたことがないので、現在のアプリケーションに適合するかどうかはわかりませんが、3 つの個別のスキーマで定義された型を参照する必要がある同様の状況で以前に使用したことがあります。

完全なXmlSchemaSetオブジェクトは、各スキーマのすべてのタイプにアクセスできます。

于 2012-04-11T14:02:46.863 に答える