使用XmlSerializer可以选择反序列化复杂类型元素

时间:2012-03-05 19:34:19

标签: c# .net deserialization xmlserializer

我收到一个XML,我有反序列化的问题,我不能创建一个适合XML模式的类。

XML Schema(以“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个元素序列和元素之间进行选择是个问题。我可以选择元素ok,但选择2个元素和一个元素no。

如何使类反序列化此架构?

1 个答案:

答案 0 :(得分:1)

这应该有效。如果ListaMensagemRetorno.Count>0那么这意味着你已经反序列化了xml2 else 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));