IXmlSerializable с допустимым XmlSchema (элемент XMLSchema: схема не объявлен ..) - PullRequest
0 голосов
/ 28 ноября 2009

Я пытаюсь реализовать IXmlSerializable. Мой класс реализует сериализуемый и пишет одну строку. Я хочу иметь возможность экспортировать схему графа объекта с помощью XsdDataContractExporter (стандартная).

Класс сериализуется в простой XML.

<Urn ns='http://palantir.co.za/urn'>somestring</Urn>

Моя реализация GetSchema, которая соответствует атрибуту XmlSchemaProvider, выглядит следующим образом.

Мне нужно иметь возможность генерировать и экспортировать схему.

    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);
    }

Я получаю следующую ошибку:

The <a href="http://www.w3.org/2001/XMLSchema:schema" rel="nofollow noreferrer">http://www.w3.org/2001/XMLSchema:schema</a> element is not declared..   
когда я пытаюсь экспортировать схему.

1 Ответ

0 голосов
/ 08 декабря 2009

Попробуйте составить схему XSD в отдельном файле (это намного проще, чем создавать во время выполнения). Убедитесь, что это правильно. Поместите схему xsd в вашу сборку в качестве ресурса. Затем в вашем методе GetSchema просто десериализуйте его:

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

Также обратите внимание, что ваш метод GetSchema будет вызываться во время выполнения при любой (де) сериализации. Так что десириализацию схемы каждый раз не очень хорошая идея.

...