提问人:bowserm 提问时间:12/10/2014 更新时间:12/10/2014 访问量:140
当您不知道命名空间时,如何反序列化 XML?
How do you deserialize XML when you don't know the namespace?
问:
我正在处理一个 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>
我不想每次发生此命名空间更改时都必须重新编译我的代码。我该如何处理?
答:
3赞
bowserm
12/10/2014
#1
我能够通过将命名空间作为默认命名空间传递给 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;
}
这一直对我有用。
评论