我需要反序列化这个 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 使用的话它会起作用<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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)