XSD не генерирует класс C #, как я ожидаю - PullRequest
1 голос
/ 18 мая 2011

У меня есть следующий XML-файл:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header xmlns:hdr="http://xml.example.com/ns/appmw/soap/1.0/header">
    <hdr:FinalMessage>true</hdr:FinalMessage>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <MyResponse>
      <Result seqNo="0">
        <MetaData>
          <DataSchema>
            <ColumnSchema type="char" ref="item1" name="Item1"/>
            <ColumnSchema type="char" ref="item2" name="Item2"/>
            <ColumnSchema type="char" ref="item3" name="Item3"/>
          </DataSchema>
        </MetaData>
        <Data>
          <Item>
            <Column ref="item1">Foo</Column>
            <Column ref="item2">Bar</Column>
            <Column ref="item3">Baz</Column>
          </Item>
          <Item>
            <Column ref="item1">Foo</Column>
            <Column ref="item2">Bar</Column>
            <Column ref="item3">Baz</Column>
          </Item>
        </Data>
      </Result>
    </MyResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Используя xsd, я сгенерировал файлы xsd, а затем класс C # из этих файлов. Это работает, и десериализация в порядке, но сгенерированный класс части данных - это не то, что я ожидал.

Вот соответствующий раздел xsd:

      <xs:element name="Data" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Item" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Column" nillable="true" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:simpleContent msdata:ColumnName="Column_Text" msdata:Ordinal="1">
                        <xs:extension base="xs:string">
                          <xs:attribute name="ref" form="unqualified" type="xs:string" />
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

Будет один раздел данных, который может иметь переменное количество элементов. Каждый элемент может иметь переменное количество столбцов.

Вот что было сгенерировано для класса:

private MyResponseResultItemColumn[][] dataField;

    [System.Xml.Serialization.XmlArrayItemAttribute("Item", IsNullable=false)]
    [System.Xml.Serialization.XmlArrayItemAttribute("Column", NestingLevel=1)]
    public MyResponseResultItemColumn[][] Data {
        get {
            return this.dataField;
        }
        set {
            this.dataField = value;
        }
    }


[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class MyResponseResultItemColumn {

    private string refField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string @ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value {
        get {
            return this.valueField;
        }
        set {
            this.valueField = value;
        }
    }
}

Как видите, xsd сделал Data массивом массивов (массив массивов ItemColumn). То, что я ожидал и хочу увидеть, - это Data как простой массив класса Item, где класс Item содержит массив ItemColumns в качестве свойства.

Есть ли способ, которым я могу достичь этого? Вместо того, чтобы MyResponse.Result.Data [0] [0] возвращал массив ItemColumn, я хочу иметь возможность набирать MyResponse.Result.Data [0] .ItemColumns.

1 Ответ

0 голосов
/ 18 мая 2011

Вы можете написать свой собственный сериализатор, реализовав интерфейс IXmlSerializable .Это немного хлопотно, но у вас есть полный контроль над формой объекта. Это довольно хорошая статья о том, как ее реализовать, которую я нашел в потоке в stackoverflow

...