当你不知道命名空间时,如何反序列化XML?

3

我正在处理一个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>

我不想每次命名空间更改时都需要重新编译代码。我该怎么处理?

1个回答

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;
}

这对我有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接