0

IXmlSerializable を実装しようとしています。私のクラスはシリアライズ可能を実装し、単一の文字列を書き込みます。XsdDataContractExporter (標準のもの) を使用してオブジェクト グラフ スキーマをエクスポートできるようにしたいと考えています。

クラスは単純な xml にシリアル化されます。

<Urn ns='http://palantir.co.za/urn'>文字列</Urn>

XmlSchemaProvider 属性に対応する GetSchema の私の実装は次のとおりです。

スキーマを生成してエクスポートできる必要があります。

    public static XmlQualifiedName GetSchema(XmlSchemaSet xs)
    {
        string ns = "http://palantir.co.za/urn";
        if (xs.Schemas("http://palantir.co.za/urn").Count != 0)
            return new XmlQualifiedName("Urn", ns); // tried many.

        XmlSchema schema = new XmlSchema();
        schema.Namespaces.Add("xs", XmlSchema.Namespace);
        schema.Namespaces.Add("Urn", ns); // tried many prefixes.
        schema.ElementFormDefault = XmlSchemaForm.Qualified;
        schema.Items.Add(
            new XmlSchemaElement() {                    
                Name = "Urn",
                SchemaTypeName = XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).QualifiedName
            });

        schema.TargetNamespace = ns;
        xs.Add(schema);
        //xs.Compile();
        return new XmlQualifiedName("Urn", schema.TargetNamespace);
    }

次のエラーが表示されます。

http://www.w3.org/2001/XMLSchema:schema要素が宣言されていません   。
スキーマをエクスポートしようとすると。

4

1 に答える 1

0

別のファイルで XSD スキーマを構成してみてください (実行時に構成するよりもはるかに簡単です)。それが正しいことを確認してください。xsd スキーマをリソースとしてアセンブリに配置します。次に、GetSchema メソッドでそれを逆シリアル化します。

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
    return XmlSchema.Read(stream, null);
}

また、メソッド GetSchema は、(デ) シリアル化の実行時に呼び出されることに注意してください。したがって、毎回スキーマをデシリアライズするのは良い考えではありません。

于 2009-12-08T15:56:08.860 に答える