Пользовательский инструмент 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" генерируется.