Xml 反序列化 returms 空值,但 xml 有值

本文关键字:xml 有值 空值 反序列化 returms Xml | 更新日期: 2023-09-27 18:35:17

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

这是我的班级:

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 服务,我不知道为什么我的反序列化不适用于最后 2 项,但与任何其他元素一起工作得更好。

Xml 反序列化 returms 空值,但 xml 有值

我已经尝试过使用您的代码并更新了以下内容,它可以工作。

  1. 评论倒数第二标签。

  2. 将最后一个标记重命名为 。可能是你弄错了xml,最后两个标签令人困惑,所以我只尝试了一个标签。

  3. 在身份验证类中,我更改了 ARP 和 NSU 的类型,否则我们在反序列化时将获得 XMlNode 类型。您也可以使用字符串代替 int。

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