我正在处理一个API,该API有时会更改我收到的XML上的名称空间. XML结构保持不变.我需要将XML反序列化为强类型模型.
无论XML上有什么命名空间,如何执行反序列化?
我正在使用这样的模型:
[Serializable, XmlRoot(ElementName = "TestModel", Namespace = "http://schemas.datacontract.org/UnkNownNamespace1")]
public class TestModel
{
public TestModel()
{
TestElements = new List<TestModelChildren>();
}
[XmlElement("TestModelChildren")]
public List<TestModelChildren> TestElements { get; set; }
}
我尝试使用以下代码将一些XML反序列化到该模型中:
public TestModel DeserializeIt(XDocument xDoc)
{
TestModel result;
var serializer = new XmlSerializer(typeof(TestModel));
using(var sr = new StringReader(xDoc.ToString()))
{
result = (TestModel)serializer.Deserialize(sr);
}
return result;
}
我的问题是,我经常收到要更改的XML命名空间.我可能会开始像这样获取XML:
<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/UnkNownNamespace2">
<TestModelChildren>
...
</TestModelChildren>
</TestModel>
我不想每次发生名称空间更改时都重新编译我的代码.我该如何处理?
解决方法:
通过将名称空间作为默认名称空间传递到XmlSerializer中,我能够解决此问题.我可以从XDocument中选择名称空间来执行此操作.
[Serializable, XmlRoot(ElementName = "TestModel")]
public class TestModel
{
public TestModel()
{
TestElements = new List<TestModelChildren>();
}
[XmlElement("TestModelChildren")]
public List<TestModelChildren> TestElements { get; set; }
}
我的反序列化XML的代码如下所示:
public TestModel DeserializeIt(XDocument xDoc)
{
TestModel result;
var serializer = new XmlSerializer(typeof(TestModel), xDoc.Root.Name.Namespace.ToString());
using(var sr = new StringReader(xDoc.ToString()))
{
result = (TestModel)serializer.Deserialize(sr);
}
return result;
}
这一直在为我工作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。