C# 如果不使用';我不知道名称空间?

C# 如果不使用';我不知道名称空间?,c#,xml,deserialization,xml-namespaces,C#,Xml,Deserialization,Xml Namespaces,我正在处理一个API,它偶尔会更改我收到的XML上的名称空间。XML结构保持不变。我需要将XML反序列化为强类型模型 无论XML上的名称空间是什么,如何执行反序列化 我使用的模型如下: [Serializable, XmlRoot(ElementName = "TestModel", Namespace = "http://schemas.datacontract.org/UnknownNamespace1")] public class TestModel { public TestM

我正在处理一个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; }
}
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;
}
<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/UnknownNamespace2">
    <TestModelChildren>
        ...
    </TestModelChildren>
</TestModel>
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;
}
我的问题是,每隔一段时间,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; }
}
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;
}
<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/UnknownNamespace2">
    <TestModelChildren>
        ...
    </TestModelChildren>
</TestModel>
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;
}

...

我不希望每次发生名称空间更改时都必须重新编译代码。如何处理它?

通过将名称空间作为默认名称空间传递给XmlSerializer,我能够解决这个问题。为此,我可以从XDocument中提取名称空间

如果没有指定名称空间,我的新模型将如下所示:

[Serializable, XmlRoot(ElementName = "TestModel")]
public class TestModel
{
    public TestModel()
    {
        TestElements = new List<TestModelChildren>();
    }

    [XmlElement("TestModelChildren")]
    public List<TestModelChildren> TestElements { get; set; }
}
这对我来说很有效