我有以下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,因为我需要从XML命名空间创建C#命名空间,而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 {}
如您所见,属性中缺少“m”较低的“消息”。并且因为我需要反序列化的xml也带有标记“message”,而较低的“m”反序列化失败。
我该如何解决这个问题?我查看了XmlSchemaImporter和XmlCodeExporter的选项,但没有什么可以做到的。或者我可以以某种方式设置XmlSerializer来禁用区分大小写?
答案 0 :(得分:4)
因此,在偷偷摸摸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));
生成具有元素名称“message”的正确XmlRootAttribute。