【问题标题】:XmlSerializer doesn't fill the XmlElementAttribute decorated collectionXmlSerializer 不填充 XmlElementAttribute 修饰的集合
【发布时间】:2013-09-23 09:08:33
【问题描述】:

我尝试反序列化以下 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 中没有收到任何错误,但消息集合始终为空。

我怀疑 XmlSerializer 无法正确解析什么是“消息”——数组项或包含字符串消息的元素。我无法更改 xml 结构,因此我必须修复我的反序列化程序或一些 xml 属性属性。

我的代码有什么问题?任何帮助表示赞赏。

【问题讨论】:

  • 我尝试让它工作但不能。我偶然发现的一件事是使用XmlElement 而不是XmlElementAttribute 作为消息元素(请参阅此处的详细信息:stackoverflow.com/questions/11731947/xml-serialization-of-list
  • 没有区别。如果您或 .NET 基础库有一些 StrangeNamedAttribute,您可以将其用作 [StrangeNamed][StrangeNamedAttribute]。谢谢你。在我发布我自己的问题之前,我知道您引用的答案中描述并阅读了它和其他一些内容。
  • 你完全正确!我的错!我想我是因为 C# 和 XML 中使用的属性而感到困惑......

标签: c# xml xml-serialization xmlserializer


【解决方案1】:

我猜你的问题与命名空间有关。由于消息似乎是唯一带有公共命名空间的元素,您可以尝试为所有子元素重置命名空间。像这样:

[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

【讨论】:

  • 是的,它成功了!如果我再次序列化实例,上面的&lt;message&gt; 变为&lt;message xmlns=""&gt;。我还对Namespace = NS.Common, Form = XmlSchemaForm.Unqualified 进行了完全序列化和反序列化结果的实验​​。
  • @meilke 好点。属性中的 String.Empty 无法编译。我用空字符串替换了它们。谢谢
  • @python_kaa 感谢后续和替代解决方案! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2012-03-04
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多