当您不了解命名空间时,如何反序化XML?

时间:2014-12-09 18:17:46

标签: c# xml deserialization xml-namespaces

我正在处理一个偶尔会更改我收到的XML上的命名空间的API。 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>

每次发生命名空间更改时,我都不想重新编译代码。我该如何处理?

1 个答案:

答案 0 :(得分:3)

我能够通过将命名空间作为默认命名空间传递给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;
}

这对我有用。