簡體   English   中英

Xml反序列化限制空值,但xml具有值

[英]Xml Deserialize returms null values but xml has values

我看到的話題很少,但沒人能解決我的問題。

這是我的課:

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. 已評論倒數第二個<autenticacao>標記。

  2. 將最后一個標簽<autorizacao>重命名為<autenticacao>。 可能是您弄錯了xml,最后兩個標簽令人困惑,所以我只嘗試了一個標簽。

  3. 在身份驗證類中,我更改了ARP和NSU的類型,否則在反序列化時會得到XMlNode類型。 您也可以使用字符串代替int。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM