CSharp - XmlSerializer不填充XmlElementAttribute修饰集合

  显示原文与译文双语对照的内容
0 0

我尝试反序列化以下 xml:


<?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没有任何错误,但消息集合总是空的。

我有一个suspection无法正确解析什么是"邮件"- array 项或者包含字符串消息的元素。 我不能改变xml结构,所以我必须修正我的反序列化例程或者一些xml属性属性。

我的代码有什么问题? 感谢你的帮助。

时间: 原作者:

0 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

原作者:
...