反序列化XML文件,并从Schema中提取不存在的值的默认值

时间:2012-08-08 20:32:33

标签: c# xml xsd xml-deserialization

我正在使用C#,我正在尝试将XML文件反序列化到我的应用程序中。这是一个线程化进程,它从多个目录中提取XML文件,其中每个目录可能具有基于客户需求的特定模式。

我要做的是使用特定目录的模式,我需要将反序列化器从XML文件加载到我的应用程序中的对象中。但是,如果未在XML文件中指定该元素,我需要反序列化器从模式中获取默认值。

我发现有一种方法可以使用[XmlSchemaProviderAttribute(“GetSchemaFile”)]属性和静态方法(ref http://msdn.microsoft.com/en-us/magazine/cc300797.aspx)指定类的模式位置。然而,这对我目前的情况不起作用,因为我有多个特定于不同文件的模式。

有谁知道这样做的方法?或者我应该尝试找到另一种方法来处理我对默认值的需求吗?

2 个答案:

答案 0 :(得分:1)

每个XML文件都应指定它使用的架构。这通常在根元素中完成。

在下面的示例中,架构与XML文件位于同一目录中。显然,相对于XML文件,这将根据模式的位置而改变。但是,关键是您使用XML文件来引用架构。然后,XML解析器将自动应用任何默认值。

<node name="/org/freedesktop/sample_object" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="introspect.xsd">

这是link,其中简要介绍了如何引用架构。

答案 1 :(得分:0)

所以我有机会测试你的建议@David使用noNamespaceSchemaLocation,并且XmlSerializer似乎没有从那里列出的模式中提取任何信息作为默认值。我一直在寻找一种方法来完成这项工作,因此我发布了这个原因。

*编辑*

在查看了许多不同的站点之后,我发现如果Schema必须是动态的,那么使用C#XML Serializer反序列化方法从模式中提取默认值是不可能的,这意味着被反序列化的对象可能具有不同的默认值模式。

我有一个解决方案,可以在我目前的情况下解决此问题,以便我们的软件处理默认设置。

感谢@David的建议。非常感谢他们。