2012-03-05 132 views
2

我收到一个XML,我有反序列化的问题,我不能创建一个适合XML模式的类。使用XmlSerializer反序列化选择的复杂类型元素

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

你应该看看XSD.EXE,这将帮助你从生成类和XSD或创建的XML从XSD – 2012-03-05 19:41:31

回答

1

这应该有效。如果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)); 
+0

这是一个XSD,然后一类不是我希望得到的答案,但是这个解决方案可以解决这个问题。但是如果我需要序列化这个类,它将不起作用,因为如果模式上有3个元素,模式将不会验证xml。 – LazyLeecher 2012-03-08 14:49:58

相关问题