【问题标题】:Using XmlSerializer to deserialize complex type elements with choice使用 XmlSerializer 选择反序列化复杂类型元素
【发布时间】:2012-03-05 19:34:19
【问题描述】:

我收到一个在反序列化时遇到问题的 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 个元素的序列和一个元素之间进行选择是个问题。我可以选择元素,但选择 2 元素和 1 元素没有。

如何创建一个类来反序列化此架构?

【问题讨论】:

  • 您应该查看 xsd.exe,它将帮助您从 xsd 生成一个类,或者从 xml 创建一个 xsd,然后从 xsd 创建一个类

标签: c# .net deserialization xmlserializer


【解决方案1】:

这应该可行。 if ListaMensagemRetorno.Count&gt;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));

【讨论】:

  • 这不是我希望的答案,但这种解决方法可以解决这种情况。但是如果我需要序列化这个类,它将无法工作,因为如果它有 3 个元素,架构将不会验证 xml。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多