【问题标题】:DataContractSerializer to deserialize a Member without namespace?DataContractSerializer 反序列化没有命名空间的成员?
【发布时间】:2014-04-18 13:06:05
【问题描述】:

我需要反序列化这个 xml(我无法更改):

<foo:a xmlns:foo="http://example.com">
  <b>string</b>
</foo:a>

我做了这门课:

[DataContract(Name = "a", Namespace = "http://example.com")]
public class A
{
    [DataMember(Name = "b", Order = 0)]
    public string B;
}

我做到了:

using (var streamObject = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
    var ser = new DataContractSerializer(typeof(A));
    return (A)ser.ReadObject(streamObject);
}

我得到了一个 A 类的对象,但是 B 的内容总是空的。我知道如果 xml 使用&lt;foo:b&gt;string&lt;/foo:b&gt;,它会起作用,但事实并非如此。如何反序列化没有命名空间的 DataMember?

【问题讨论】:

  • 好一个。一定要使用 DataContract 序列化吗?
  • 您可以在 datacontract 属性中删除所有 Namespace = "" 的命名空间。那么你最终会得到 和
  • @Andrew,xml 不会反序列化
  • 对不起,我以为他也用这个类来创建xml
  • @d_z 不,我不必...但它会为我省去一些麻烦(例如:我使用 DataContractSerializer 为应用程序做了所有其他事情,包括肥皂和 json)。我不喜欢以不同的方式混合处理 this 和 json。

标签: c# xml namespaces datacontractserializer datamember


【解决方案1】:

如果你可以在反序列化之前对xml进行预处理,那么请尝试执行以下操作:

将数据合同中的命名空间设为空:

[DataContract(Name = "a", Namespace = "")]
public class A
{
    [DataMember(Name = "b", Order = 0)]
    public string B;
}

在反序列化之前从您的 xml 中删除命名空间属性

XDocument doc = XDocument.Parse("your xml here");
XElement root = doc.Root;

XAttribute attr = root.Attribute("xmlns");
if (attr != null) 
{
    attr.Remove();
}

然后反序列化更新的xml:

string newXml = doc.ToString();   

A result = null;
DataContractSerializer serializer = new DataContractSerializer(typeof(A));

using (StringReader backing = new StringReader(newXml))
{
    using (XmlTextReader reader = new XmlTextReader(backing))
    {
        result = (A) serializer.ReadObject(reader);
    }
}

【讨论】:

  • 谢谢,完全删除命名空间是我目前的解决方法。我正在使用 Regexp.Replace();我会看看我是否可以按照你的建议使用 XAttribute.Remove() 。但是这个解决方案的一些问题是我还需要破解序列化以稍后插入命名空间。
  • 为什么使用 XmlTextReader 而不是 MemoryStream?为什么它会更好的任何链接?
  • 要重新添加命名空间,请查看此处的问题:stackoverflow.com/questions/11021931/… 或 msdn.microsoft.com/en-us/library/bb387075.aspx。你可以使用 MemoryStream,我只是习惯使用 XmlTextReader。
猜你喜欢
  • 2010-12-23
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多