Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML可序列化c中的DateTime System.FormatException#_C#_Xml_Serialization - Fatal编程技术网

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

C# XML可序列化c中的DateTime System.FormatException#,c#,xml,serialization,C#,Xml,Serialization,我正在尝试从XML读取数据。 除了日期字段外,一切都很好。当日期字段为空时,我得到异常 System.FormatException:字符串“”不是有效的AllXsd值。 位于System.Xml.Schema.XsdDateTime..ctor(字符串文本,XsdDateTimeFlags 在System.Xml.XmlConvert.ToDateTime(字符串s, XmlDateTimeSerializationMode dateTimeOption)位于 System.Xml.Seria

我正在尝试从XML读取数据。
除了日期字段外,一切都很好。当日期字段为空时,我得到异常

System.FormatException:字符串“”不是有效的AllXsd值。
位于System.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>

当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响应捕获为字符串,并在代码中将其转换为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;
   }
}

您可以使用修改XML吗?如果是这样的话,
可能会起作用。在以下
C#[DefaultValueAttribute(typeof(System.DateTime),
上进行一次简单的谷歌搜索,注意搜索结果中出现了多少示例,也许可以将其更改为如下所示,例如
[System.ComponentModel.DefaultValue(typeof(DateTime),“”)
无法修改XML@MikeH@MethodMan,尝试了
[System.ComponentModel.DefaultValue(typeof(DateTime),“”)]
,但异常仍然存在。您能否将该值视为字符串,然后在需要时使用程序中的属性进行转换?这为解决方案提供了线索
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;
   }
}