微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

未知名称空间时,如何反序列化XML?

我正在处理一个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 举报,一经查实,本站将立刻删除。