Xml Deserialize返回空值,但xml具有值

时间:2013-10-15 04:47:13

标签: c# .net xml serialization xml-parsing

我看到的主题很少,但没有人看起来像我的问题。

这是我的班级:

namespace Framework.Cielo.Models
{
    [XmlRoot("transacao", Namespace = "http://ecommerce.cbmp.com.br")]
    public class TransactionResponse
    {
        [XmlAttribute("id")]
        public string ID { get; set; }

        [XmlAttribute("versao")]
        public string Version { get; set; }

        [XmlElement("tid")]
        public string tid { get; set; }

        [XmlElement("pan")]
        public string pan { get; set; }

        [XmlElement("dados-pedido")]
        public EstablishmentOrder Order { get; set; }

        [XmlElement("forma-pagamento")]
        public PaymentMethod PaymentMethod { get; set; }

        [XmlElement("status")]
        public TransactionStatusEnum Status { get; set; }

        [XmlElement("url-retorno")]
        public string ReturnUrl { get; set; }

        [XmlElement("autenticacao")]
        public Authentication Authentication { get; set; }
    }
}

这是认证类

namespace Framework.Cielo.Models
{
    [XmlRoot("autenticacao")]
    public class Authentication
    {
        [XmlElement("codigo")]
        public int Code { get; set; }

        [XmlElement("mensagem")]
        public string Message { get; set; }

        [XmlIgnore]
        public DateTime Date { get; set; }

        [XmlElement("data-hora")]
        public string FormattedDate
        {
            get
            {
                return Date.ToString("yyyy-MM-ddTHH:mm:ss");
            }
            set
            {
                DateTime kdc = DateTime.MinValue;
                DateTime.TryParse(value, out kdc);
                Date = kdc;
            }
        }

        [XmlElement("valor")]
        public int Value { get; set; }

        [XmlElement("lr")]
        public int SecurityLevel { get; set; }

        [XmlElement("arp")]
        public object arp { get; set; }

        [XmlElement("nsu")]
        public object nsu { get; set; }
    }
}

以下是我反序列化的方法:

string serializado = File.ReadAllText("req.xml");
var stringReader = new System.IO.StringReader(serializado);
var serializer = new XmlSerializer(typeof(TransactionResponse));

TransactionResponse preAuthResponse = serializer.Deserialize(stringReader) as TransactionResponse;

这是我的XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<transacao versao="1.3.0" id="100" xmlns="http://ecommerce.cbmp.com.br">
  <tid>10069930690A16DF1001</tid>
  <pan>b1SQ6jpKCDt3n9C0dgD/ZkPQ1Bh+7aJESqr/CwP64P0=</pan>
  <dados-pedido>
    <numero>100</numero>
    <valor>29900</valor>
    <moeda>986</moeda>
    <data-hora>2013-10-15T00:57:19.032-03:00</data-hora>
    <descricao/>
    <idioma>PT</idioma>
    <taxa-embarque>0</taxa-embarque>
  </dados-pedido>
  <forma-pagamento>
    <bandeira>mastercard</bandeira>
    <produto>1</produto>
    <parcelas>1</parcelas>
  </forma-pagamento>
  <status>4</status>
  <autenticacao>
    <codigo>4</codigo>
    <mensagem>Transacao sem autenticacao</mensagem>
    <data-hora>2013-10-15T00:57:19.037-03:00</data-hora>
    <valor>29900</valor>
    <eci>0</eci>
  </autenticacao>
  <autorizacao>
    <codigo>4</codigo>
    <mensagem>Transação autorizada</mensagem>
    <data-hora>2013-10-15T00:57:19.041-03:00</data-hora>
    <valor>29900</valor>
    <lr>00</lr>
    <arp>123456</arp>
    <nsu>661215</nsu>
  </autorizacao>
</transacao>

当我运行此代码时,所有元素都正确,但不是ARPNSU元素(autorizacao标记的最后2个)

我真的不知道为什么。这个XML来自一个Web服务,我无法弄清楚为什么我的反序列化不适用于最后两个项目,但对其他任何元素都有效。

1 个答案:

答案 0 :(得分:0)

我已尝试使用您的代码并更新了以下内容并且有效。

  1. 第二个评论&lt; autenticacao&gt;标签。

  2. 重命名最后一个标记&lt; autorizacao&gt; &lt; autenticacao&gt; 。可能是你错了xml&amp;最后两个标签令人困惑,所以我只试过一个标签。

  3. 在Authentication类中,我更改了ARP和NSU的类型,否则我们在反序列化时获得XMlNode类型。您也可以使用string而不是int。

    [XmlElement("arp")]
    public int arp { get; set; }
    
    [XmlElement("nsu")]
    public int nsu { get; set; }