1

次の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 はすべてのクラスを 1 つの 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 を設定できますか?

4

1 に答える 1

4

そのため、Xsd2Codeソースコードを忍び込んだ後、興味深いことがわかりました。これらの2つのループを使用して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が生成されます。

于 2012-09-25T08:58:32.547 に答える