[英]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.