在使用XmlSerializer.Deserialize()方法嘗試反序列化特定XML文檔時,我遇到了相當惱人的問題。用強類型XSD解析XML文檔時出錯
基本上,我有一個類型爲double的元素的強類型XSD。當試圖爲特定的XML文檔反序列化元素時,我得到了通常的「System.FormatException:輸入字符串格式不正確。」例外,因爲在該特定文檔中,該元素沒有值。
這裏有一些代碼爲你nerds在那裏。
示例XML文檔:
<TrackInfo>
<Name>Barcelona</Name>
<Length>4591</Length>
<AverageSpeed />
</TrackInfo>
XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="TrackInfo">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Length" type="xs:double" default="0.0" />
<xs:element name="AverageSpeed" type="xs:double" default="0.0" />
</xs:sequence>
</xs:complexType>
</xs:element>
TrackInfo類:
[Serializable]
public class TrackInfo
{
private string name = string.Empty;
private double length = 0.0;
private double averageSpeed = 0.0;
[XmlElement]
public string Name
{ ... }
[XmlElement]
public double Length
{ ... }
[XmlElement]
public double AverageSpeed
{ ... }
}
樣品deserialisation代碼:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("TrackInfo.xml");
// Deserialise XML string into TrackInfo object
byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlDocument.InnerXml);
MemoryStream stream = new MemoryStream(buffer);
System.Xml.XmlReader reader = new System.Xml.XmlTextReader(stream);
XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(TrackInfo));
TrackInfo trackInfo = (TrackInfo)xSerializer.Deserialize(reader);
我知道deserialisation例外來自於一個事實,一個空字符串不能轉換爲double。我也知道默認值沒有賦值給AverageSpeed,因爲實際上,一個空字符串是一個完全可以接受的值。
如果在XML文檔中找到空字符串值時,是否有一種簡單的方法可以在解串行化時將double值默認爲0.0(或任何其他類型)? 理想情況下,我想避免實現ISerializable,因爲我真的不想讓今天的其餘時間花在地獄的燃燒坑(即實現大約一百個班的ISerializable)。
乾杯! Jean-Michel