對於this question,我有同樣的問題。我使用基於SOAP的API來回發送數據,其中響應不符合標準,特別是空值。對於DateTime
,該API將發送回一個空字符串,像這樣:在XML反序列化中將空字符串處理爲空
<nextreview></nextreview>
導致反序列化上出現以下錯誤:
字符串「」不是一個有效的AllXsd值。
所以我的想法是創建一個自定義空類型,NullableOrEmpty<T>
,通過轉換爲null實施IXMLSerializable
,處理空字符串。問題是我只想處理空字符串的例外情況。我想用正常的序列化和反序列化來使用'默認'行爲。我如何在下面的代碼中模擬序列化的默認行爲?
public class NullableOrEmpty<T> : IXmlSerializable
where T : struct
{
public T? NullableValue { get; set; }
public T Value { get { return this.NullableValue.Value; } }
public bool HasValue { get { return this.NullableValue.HasValue; } }
...
public void ReadXml(XmlReader reader)
{
string xml = reader.ReadElementContentAsString();
if (string.IsNullOrEmpty(xml))
{
this.NullableValue = null;
}
else
{
//THIS SHOULD DO THE DEFAULT. THIS DOESN'T WORK. WHAT DO I DO??
//this.NullableValue = (T?)new XmlSerializer(typeof(T?)).Deserialize(reader);
}
}
public void WriteXml(XmlWriter writer)
{
//THIS SHOULD DO THE DEFAULT. THIS DOESN'T WORK. WHAT DO I DO??
//new XmlSerializer(typeof(T?)).Serialize(writer, this.NullableValue);
}
}
當我說「這行不通」,它專門生成以下錯誤消息,可能是因爲它試圖消耗的東西,是不是有:
有一個錯誤XML文檔(63, 6)。
<lastreview xmlns=''>
不是 預計。
這是在該位置的XML片段。該錯誤是由價值birthdate
造成的,因爲我不是在價值實際上是賦予非特殊情況下正確地消費它:
<udf4></udf4>
<udf3></udf3>
<birthdate>1978-05-24Z</birthdate>
<lastreview></lastreview>
<fulltime>1</fulltime>
任何想法或想法讚賞。如果需要,我可以發佈更多代碼示例或測試出建議。謝謝!
你不能使用相同的'XmlReader'。您已經閱讀過要再次閱讀的內容。 – 2011-05-24 22:01:15