Использование XmlSerializer для десериализации элементов сложного типа с выбором - PullRequest
2 голосов
/ 05 марта 2012

Я получаю XML, из-за которого возникла проблема с десериализацией, я не могу создать класс, который соответствует схеме XML.

Схема XML (каждое имя типа, начинающееся с "ts", - SimpleType):

<xsd:element name="ConsultarSituacaoLoteRpsResposta">
    <xsd:complexType>
        <xsd:choice>
            <xsd:sequence>
                <xsd:element name="NumeroLote" type="tsNumeroLote" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="Situacao" type="tsSituacaoLoteRps" minOccurs="1" maxOccurs="1"/>
            </xsd:sequence>
            <xsd:element ref="ListaMensagemRetorno" minOccurs="1" maxOccurs="1"/>
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

<xsd:element name="ListaMensagemRetorno">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="MensagemRetorno" type="tcMensagemRetorno" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:complexType name="tcMensagemRetorno">
    <xsd:sequence>
        <xsd:element name="Codigo" type="tsCodigoMensagemAlerta" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="Mensagem" type="tsDescricaoMensagemAlerta" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="Correcao" type="tsDescricaoMensagemAlerta" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

Я получаю:

XML 1

<ConsultarSituacaoLoteRpsResposta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
    <NumeroLote>21</NumeroLote>
    <Situacao>4</Situacao>
</ConsultarSituacaoLoteRpsResposta>

Или XML 2

<ConsultarSituacaoLoteRpsResposta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
   <ListaMensagemRetorno>
      <MensagemRetorno>
           <Codigo>E01</Codigo>
           <Mensagem>AAA</Mensagem>
           <Correcao>BBB</Correcao>
      </MensagemRetorno>
      <MensagemRetorno>
           <Codigo>E02</Codigo>
           <Mensagem>CCC</Mensagem>
           <Correcao>DDD</Correcao>
      </MensagemRetorno>
   </ListaMensagemRetorno>
</ConsultarSituacaoLoteRpsResposta>

Выбор между последовательностью из 2 элементов и элементомэто проблема.Я могу сделать выбор элементов в порядке, но выбор из 2 элементов и одного элемента нет.

Как создать класс для десериализации этой схемы?

1 Ответ

1 голос
/ 06 марта 2012

Это должно работать.если ListaMensagemRetorno.Count>0, то это означает, что вы десериализовали xml2, иначе xml1

public class ConsultarSituacaoLoteRpsResposta
{
    public int NumeroLote { set; get; }
    public int Situacao { set; get; }
    public List<MensagemRetorno> ListaMensagemRetorno { get; set; }
}
public class MensagemRetorno
{
    public string Codigo { set; get; }
    public string Mensagem { set; get; }
    public string Correcao { set; get; }
}

XmlSerializer serializer = new XmlSerializer(typeof(ConsultarSituacaoLoteRpsResposta), "http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd");
var obj1 = (ConsultarSituacaoLoteRpsResposta)serializer.Deserialize(new StringReader(xml1));
var obj2 = (ConsultarSituacaoLoteRpsResposta)serializer.Deserialize(new StringReader(xml2));
...