簡體   English   中英

XML可序列化的c#中的DateTime System.FormatException

[英]DateTime System.FormatException in XML Serializable c#

我正在嘗試從XML讀取數據。
除日期字段外,其他所有內容都很好。 每當date字段為null時,我就會收到異常

System.FormatException:字符串“”不是有效的AllXsd值。
在System.Xml.Xml.Xml.Schema.XsdDateTime..ctor(字符串文本,XsdDateTimeFlags種)在System.Xml.XmlConvert.ToDateTime(字符串s,XmlDateTimeSerializationMode dateTimeOption)在System.Xml.Serialization.XmlSerializationReader.ToDateTime(字符串值)

這是我的XML

<TRANSACTION>
    <TRANSACTION_ID></TRANSACTION_ID>
    <MERCHANT_ACC_NO>02700701354375000964</MERCHANT_ACC_NO>
    <TXN_STATUS>F</TXN_STATUS>
    <TXN_SIGNATURE777779</TXN_SIGNATURE>
    <TXN_SIGNATURE2>877888C</TXN_SIGNATURE2>
    <TRAN_DATE></TRAN_DATE>
    <MERCHANT_TRANID>151019OHOOZS1</MERCHANT_TRANID>
    <RESPONSE_CODE>3009</RESPONSE_CODE>
    <RESPONSE_DESC>Unable to find the transaction record!</RESPONSE_DESC>
    <AUTH_ID></AUTH_ID>
    <AUTH_DATE></AUTH_DATE>
    <CAPTURE_DATE></CAPTURE_DATE>
    <SALES_DATE></SALES_DATE>
    <VOID_REV_DATE></VOID_REV_DATE>
  </TRANSACTION>
</TRANSACTION_RESPONSE>

現在我的課

[Serializable]
    public class MaybankeBPGResponse
    {
        [XmlElement("TRANSACTION_ID")]
        public string MaybankeBPGTxnId { get; set; }

        [XmlAttribute("MERCHANT_TRANID")]
        public string MerchantTxnId { get; set; }

        [DefaultValueAttribute(typeof(System.DateTime), "1901-01-01")]
        [XmlElement("TRAN_DATE")]
        public DateTime? AuthDate { get; set; }

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

我懷疑當XML值為null時,AuthDate元素引起了問題。

您可以使用這樣的中間屬性嗎?

[XmlElement("TRAN_DATE")]
public string? stringAuthDate { get; set; }

[XmlIgnore]
public DateTime AuthDate
{
  get
  {
    DateTime dt;
    if (stringAuthDate.HasValue && DateTime.TryParse(stringAuthDate.Value, out dt))
      return dt;
    else
      return DateTime.MinValue;
  }
  set
  {
    stringAuthDate = value.ToShortDateString();   
  }
}

問題是XML至少在數據類型方面無效。 如錯誤消息所示,XML中的日期為空字符串。 xml片段指示elemtn AUTH_DATE的值是一個空字符串,而不是空值。 如果要使用空值,則需要。

您有幾種解決方案,最簡單,最骯臟的是:-添加用於將數據捕獲為原始字符串的屬性-修改現有屬性以從該新屬性中解析數據

[Serializable]
public class MaybankeBPGResponse
{
    [XmlElement("TRANSACTION_ID")]
    public string MaybankeBPGTxnId { get; set; }

    [XmlAttribute("MERCHANT_TRANID")]
    public string MerchantTxnId { get; set; }

    [DefaultValueAttribute(typeof(System.DateTime), "1901-01-01")]
    [XmlElement("TRAN_DATE")]
    [EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
    [System.ComponentModel.BrowsableAttribute(false)]
    public DateTime? AuthDateForSerialization { get; set; }

    public DateTime? AuthDate { 
        get {
            return String.IsNullOrEmpty(AuthDateForSerialization) ? null : DateTime.ParseExact(AuthDateForSerialization, "yyyy-MM-dd", CultureInfo.InvariantCulture);
        }
        set {
            AuthDateForSerialization = value.HasValue ? value.Value.ToString("yyyy-MM-dd") : String.Empty;
        }
    }

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

謝謝大家的反饋。
根據提供的注釋和答案,我添加了一個新屬性,以將TRAN_DATE響應捕獲為字符串並將其轉換為代碼中的日期。 這是片段

  [Serializable]
    public class MaybankeBPGResponse
   { 
    public DateTime? AuthDate { get; set; }

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

   }

在閱讀部分中,添加了以下修改

using (TextReader xmlreader = new StringReader(responseData))
 {
   QueryResponse value = (QueryResponse)serializer.Deserialize(xmlreader);
   result = value.transaction;

  DateTime autDate = DateTime.MinValue;

  if (!string.IsNullOrEmpty(result.AuthDateXML))
   {
    DateTime.TryParseExact(result.AuthDateXML, "dd-MM-yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out autDate);
     result.AuthDate = autDate;
   }
}

暫無
暫無

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

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