Пользовательский инструмент xsd.exe и чувствительная к регистру XML-сериализация

У меня есть следующие xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
        targetNamespace="http://www.something.com/GetWrapRequest"
        elementFormDefault="qualified" attributeFormDefault="qualified" version="1.0"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:gwreq="http://www.something.com/GetWrapRequest">

    <xsd:element name="message" type="gwreq:Message">
        <xsd:annotation>
            <xsd:documentation>Complete message</xsd:documentation>
        </xsd:annotation>
    </xsd:element>
    <xsd:complexType name="Message">
        <!-- something here -->
    </xsd:complexType>
</xsd:schema>

И для создания класса C# я использую модифицированный код из http://hosca.com/blog/post/2008/12/26/Generating-C-classes-from-FpML-Schema.aspx я не могу использовать обычный xsd.exe, потому что Мне нужно создать пространства имен C# из пространств имен XML, а xsd.exe помещает все классы в одно пространство имен C#. Поэтому я нашел этот кусок кода и расширил его, чтобы создать правильные пространства имен. Но все части, связанные с преобразованием xsd в CodeDom, остались прежними.

Моя проблема сейчас заключается в том, что xsd.exe генерирует это:

[System.Xml.Serialization.XmlRootAttribute("message", Namespace="http://www.something.com/GetWrapRequest", IsNullable=true)]
public partial class Message {}

и мой код генерирует это:

[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.something.com/GetWrapRequest", IsNullable=true)]
public partial class Message {}

Как вы можете видеть, "сообщение" с более низким "м" отсутствует в атрибуте. И потому, что XML, который мне нужно десериализовать, также с тегом "message" с более низким "m", десериализация не удалась.

Как я могу решить это? Я посмотрел на параметры XmlSchemaImporter и XmlCodeExporter, но ничего не поделаешь. Или я могу как-то настроить XmlSerializer для отключения чувствительности к регистру?

1 ответ

Решение

Так что, пробравшись в исходный код Xsd2Code, я нашел интересную вещь. Я использую эти две петли для создания сопоставления XML

foreach (XmlSchemaType schemaType in rootSchema.SchemaTypes.Values)
    xmlTypeMappings.Add(xmlSchemaImporter.ImportSchemaType(schemaType.QualifiedName));
foreach (XmlSchemaElement schemaElement in rootSchema.Elements.Values)
    xmlTypeMappings.Add(xmlSchemaImporter.ImportTypeMapping(schemaElement.QualifiedName));

Но в Xsd2Code они сначала обрабатывают элементы, а затем типы схем. Поэтому я просто изменяю порядок этих циклов следующим образом:

foreach (XmlSchemaElement schemaElement in rootSchema.Elements.Values)
    xmlTypeMappings.Add(xmlSchemaImporter.ImportTypeMapping(schemaElement.QualifiedName))
foreach (XmlSchemaType schemaType in rootSchema.SchemaTypes.Values)
    xmlTypeMappings.Add(xmlSchemaImporter.ImportSchemaType(schemaType.QualifiedName));

И правильный XmlRootAttribute с именем элемента "message" генерируется.

Другие вопросы по тегам