c# - 当您不知道命名空间时如何反序列化 XML?

标签 c# xml deserialization xml-namespaces

我正在处理一个偶尔会更改我收到的 XML 上的 namespace 的 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 上的 namespace 经常发生变化。我可能会像这样开始获取 XML:

<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/UnknownNamespace2">
    <TestModelChildren>
        ...
    </TestModelChildren>
</TestModel>

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

最佳答案

我能够通过将命名空间作为默认命名空间传递给 XmlSerializer 来解决问题。我可以从 XDocument 中提取 namespace 来执行此操作。

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

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

这对我很有效。

关于c# - 当您不知道命名空间时如何反序列化 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385983/

相关文章:

c# - 字符缺失

ruby - 从数组中检索输入

java - 反序列化加密的对象列表

tomcat - java.io.NotSerializableException:org.saiku.datasources.connection.SaikuOlapConnection

c# - 与数据表进行数据绑定(bind)后,GridView Column.Count 始终为 0

c# - 层次结构对象的通用类工厂或方法

java - 在 Java 中使用 XML 解析器创建文档变量时出错

java - 验证时出错

c# - 反序列化 :anyType 的列表

C# 在转换后访问类成员