Созданный xsd.exe класс C # из W3C XMLschema.xsd (схема проверки xsd) не принимается C # XmlSerializer - PullRequest
1 голос
/ 17 июня 2011

Утилита 'xsd.exe' создаст исходный код класса c #, который по-разному соответствует информации в файле схемы xsd.

Итак, я загружаю файл схемы 'XMLSchema.xsd', расположенный по адресу "http://www.w3.org/2001/XMLSchema" - это схема для самих файлов xsd.

Я создаю класс C #, соответствующий'схема для схем', используя:

xsd.exe /classes /namespace:w3c XMLSchema.xsd

Пока все хорошо. Я получаю файл "XMLSchema.cs", содержащий "схему" класса C #, и другие вещи в пространстве имен "w3c", которые яперейти к добавлению в проект C #, который также содержит следующее:

try
{
    XmlSerializer loader = new XmlSerializer(typeof(w3c.schema));

    //never here!! previous line throws!

    FileStream fs = new FileStream(
        @"M:\src\Interfaces\MyClass1.xsd", FileMode.Open, FileAccess.Read
        );

    object fromXml = loader.Deserialize(fs);
    w3c.schema MyClass1Schema = (w3c.schema)fromXml;
}
catch(Exception e)
{
}

К сожалению, в первой строке блока try выдается следующая ошибка:

Элемент XML'аннотация' из пространства имен 'http://www.w3.org/2001/XMLSchema' уже присутствует в текущей области. Используйте атрибуты XML, чтобы указать другое имя XML или пространство имен для элемента.

Кто-нибудь сталкивался с этой ошибкой?

Я бы предпочел не вносить никаких изменений в сгенерированный файл 'XMLSchema.cs'.

Я также (изначально) попытался:

xsd /classes XMLSchema.xsd

(и в пространстве теста C # нет пространства именкод) с тем же результатом.

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

Я собираюсь предположить, что проблема не имеет ничего общего с пространствами имен .NET, как вы уже догадались, с помощью второй команды, но с пространствами имен XML.

Проблема, которая возникает у вас, заключается в том, чтофайл XSD определяет пространство имен (вероятно, xsd), которое уже использует XML Serializer (для, к удивлению, XSD для XSD).

Я не уверен, что спецификация XML говорит для двух эквивалентныхпространства имен с разными идентификаторами, но правильным способом решения этой проблемы будет изменение пространства имен вашего входного XSD-файла.Конечно, это сделает его недействительным, но я думаю, что он остановит XmlSerializer бросок, я думаю.

0 голосов
/ 17 июня 2011

Я полагаю, что вы не можете использовать пространство имен в typeof (), вместо этого поместите имя объекта (экземпляр класса), который вы пытаетесь сериализовать.

...