Сериализация в XML и XSD с расположением схемы приводит к неверному XSD - PullRequest
0 голосов
/ 29 июля 2011

Я использую .NET 3.5 для сериализации класса в Xml и для создания схемы XSD.Сгенерированный XML ссылается на XSD с помощью атрибута расположения схемы.

Мое решение основано на следующих ответах: XmlSerialization и xsi: SchemaLocation (xsd.exe) и Сериализация XML и схемабез xsd.exe

Я добавляю в свой класс атрибут для ссылки на XSD:

[XmlAttribute("schemaLocation", Namespace = XmlSchema.InstanceNamespace)]
public string XsiSchemaLocation = "MyNameSpace " + "MyNameSpace.xsd";

Проблема в том, что поле XsiSchemaLocation заканчивается в моем файле XSD:

<xs:attribute xmlns:q1="http://www.w3.org/2001/XMLSchema-instance" ref="q1:schemaLocation" />

Когда я пытаюсь отредактировать мой сериализованный файл XML, автозаполнение в Visual Studio не работает из-за вышеуказанного атрибута и выдает следующую ошибку:

'* Атрибут 1019 * не объявлен.

Мое текущее решение по удалению атрибута расположения схемы из XSD заключается в следующем хаке:

    XmlReflectionImporter importer = new XmlReflectionImporter();
    XmlSchemas schemas = new XmlSchemas();
    XmlSchemaExporter exporter = new XmlSchemaExporter(schemas);
    XmlTypeMapping map = importer.ImportTypeMapping(m_SerializedType);
    exporter.ExportTypeMapping(map);
    using (var tw = new StreamWriter(m_XsdPath))
    {
        //Hack to remove the schema location from the XSD.
        ((System.Xml.Schema.XmlSchemaComplexType)(schemas[0].Items[1])).Attributes.Clear();
        schemas[0].Write(tw);
    }

Есть ли лучший способ, чемпринудительное удаление атрибута.Что-то вроде атрибута [XmlSchemaIgnore] было бы идеально.

1 Ответ

0 голосов
/ 29 июля 2011

Сериализация XML предназначена для сериализации ваших данных.Если schemaLocation является частью ваших данных, то вы хотите, чтобы они были в вашей схеме.Если его нет в ваших данных, вам не следует сериализовать его.

Помните, что schemaLocation - это только подсказка для инструментов, которые хотят обратиться к схеме.Во многих случаях это не нужно (например, Visual Studio).

...