gpt4 book ai didi

c# - DataContractSerializer 反序列化没有命名空间的成员?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:31 26 4
gpt4 key购买 nike

我需要反序列化这个 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类的内容一直是​​null。我知道如果 xml 使用 <foo:b>string</foo:b> 会起作用, 但事实并非如此。如何反序列化没有命名空间的 DataMember?

最佳答案

如果你可以在反序列化之前对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);
}
}

关于c# - DataContractSerializer 反序列化没有命名空间的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com