2009-01-20 60 views
2

在使用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

回答

1

您可以像

[XmlElement] 
    [System.ComponentModel.DefaultValueAttribute(0.0)] 
    public double AverageSpeed 
    { ... } 

/編輯指定的默認值。無論我在屬性中設置的值如何,它始終是字段值:

private double averageSpeed = 2.0; 

但沒有發生異常。

0

您可以編輯模式以指定AverageSpeed值不可爲空。這就要求當然,無論產生什麼XML實際上都遵循該模式。

<?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" nillable="false" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
1

一個可能的解決方案是使用double?(帶問號,或可空值<雙>)。這允許您的值類型存儲空值,並且解串器不會阻塞空值。這裏好了,奇怪的beaviour: