2013-09-23 31 views
1

IM嘗試反序列化下面的XML:XmlSerializer的不填充XmlElementAttribute裝飾收集

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<common:messages xmlns:xlink="http://www.w3.org/1999/xlink" 
       xmlns:ns3="http://rest.immobilienscout24.de/schema/platform/gis/1.0" 
       xmlns:common="http://rest.immobilienscout24.de/schema/common/1.0"> 
    <message> 
    <messageCode>ERROR_DESCRIPTION</messageCode> 
    <message>The request is not schema valid. [MESSAGE: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 3; cvc-complex-type.2.4.a: Invalid content was found starting with element 'external-Id'. One of '{externalId, title}' is expected.] </message> 
    </message> 
    <message> 
     ... 
    </message> 
</common:messages> 

到以下messages類的實例:

[XmlRoot("messages", Namespace = NS.Common)] 
public partial class messages 
{ 
    [XmlElementAttribute("message")] 
    public List<Message> message { get; set;} 
} 

public partial class Message 
{ 
    [XmlElement("messageCode", Namespace = NS.Common)] 
    public MessageCode messageCode { get; set; } 

    [XmlElement("message", Namespace = NS.Common)] 
    public string message { get; set; } 
} 

[Serializable] 
[XmlType(Namespace = NS.Common)] 
public enum MessageCode 
{ 
    ERROR_DESCRIPTION, 
    RESOURCE_CREATED 
} 


public class NS 
{ 
    public const string Common = "http://rest.immobilienscout24.de/schema/common/1.0"; 
} 

public class XmlHelper 
{ 
    public static T Deserialize<T>(string xml, Encoding encoding = null) where T : new() 
    { 
      if (xml == string.Empty) 
       return new T(); 

      var serializer = new XmlSerializer(typeof(T)); 
      encoding = encoding ?? Encoding.UTF8; 
      using (var stream = new MemoryStream(encoding.GetBytes(xml))) 
       return (T)serializer.Deserialize(stream); 
    } 
} 

我沒有得到任何來自XmlSerializer的錯誤,但該消息收集總是空的。

我懷疑XmlSerializer無法正確解析什麼是「消息」 - 數組項或包含字符串消息的元素。我無法更改xml結構,所以我必須修復我的反序列化程序或某些xml屬性屬性。

我的代碼有什麼問題?任何幫助讚賞。

+0

我試圖得到它的工作,但不能。我st upon的一件事是使用'XmlElement'而不是'XmlElementAttribute'作爲消息元素(請參閱詳細信息:http://stackoverflow.com/questions/11731947/xml-serialization-of-list) – meilke

+0

沒有區別。如果您或.NET基本庫有一些StrangeNamedAttribute,您可以將它用作[[StrangeNamed]]或[[StrangeNamedAttribute]]。謝謝你。我意識到你在引用自己的問題之前所引用的答案中所描述的解決方法,並在閱讀它和其他一些答案之前先閱讀它。 –

+0

你是絕對正確的!我的錯!我想我很困惑,因爲在C#和XML中使用的屬性... – meilke

回答

0

我想你的問題是命名空間。由於消息似乎是承載公共名稱空間的唯一元素,因此您可以嘗試重置所有子元素的名稱空間。事情是這樣的:

[XmlRoot("messages", Namespace = NS.Common)] 
public partial class messages 
{ 
    [XmlElementAttribute("message", Namespace = "")] 
    public List<Message> message { get; set;} 
} 

public partial class Message 
{ 
    [XmlElement("messageCode", Namespace = "")] 
    public MessageCode messageCode { get; set; } 

    [XmlElement("message", Namespace = "")] 
    public string message { get; set; } 
} 

[Serializable] 
[XmlType(Namespace = "")] 
public enum MessageCode 
{ 
    ERROR_DESCRIPTION, 
    RESOURCE_CREATED 
} 

Form = System.Xml.Schema.XmlSchemaForm.Unqualified

+0

您是否能夠正確地反序列化?我的猜測不是。 – meilke

+0

是的,它已經工作了!如果我再次序列化實例,則上面的''變成''。我也嘗試了'Namespace = NS.Common,Form = XmlSchemaForm.Unqualified'與完全序列化和反序列化的結果。 –

+0

@meilke好點。 String.Empty屬性不能編譯。我用空弦替換了它們。 thx – jbl