XSD更改时,针对XSD验证XML

时间:2014-12-03 20:09:30

标签: c# xml serialization xsd

假设我有一个名为XSD的{​​{1}}架构。假设生成的类看起来像

xsd1

然后我创建一个新的模式public class ClassA { public string Prop1 { get; set; } public string Prop2 { get; set; } } ,它与xsd1几乎相同。它只有一个xsd2类型的元素Prop3。然后int更改为

ClassA

现在,当我将public class ClassA { public string Prop1 { get; set; } public string Prop2 { get; set; } public int Prop3 { get; set; } } 的实例序列化为XML时,针对ClassA的验证失败并显示消息

无效的子元素' Prop3'

如何才能让两个验证成功?我不想要两个单独的课程。

更新

序列化对象

xsd1

看起来像

var a = new ClassA() { Prop1 = "p1", Prop2 = "p2" };

当我向<ClassA> <Prop1>p1</Prop1> <Prop2>p2</Prop2> </ClassA> 添加Prop3时,序列化对象ClassA becommes

a

因此对模式<ClassA> <Prop1>p1</Prop1> <Prop2>p2</Prop2> <Prop3>0</Prop3> </ClassA> 无效。在针对xsd1进行验证时,我只想序列化xsd1Prop1

1 个答案:

答案 0 :(得分:0)

您的问题类似于架构版本控制问题,您在添加新元素时同时寻求向前和向后兼容性。这根本不可能。

添加可选元素允许对XSD 1 有效的XML继续对新版本XSD 2 有效。那部分没问题。但是,任何包含可选新元素的XML对原始版本XSD 1 都无效。

更新

  

当我发布新架构时,客户需要时间来调整其代码。

足够公平 - 一个共同的要求。

  

我们的客户向我们发送数据(对象,而不是xml)

这与建议的最佳做法相反。

  

他们确定应该验证哪个架构

然后通过在转换期间支持两个XSD来履行他们的承诺(而不是试图打败它),或通过xsd:any等自由机制为您的XSD建立灵活性。这取决于你,但你不能指望验证既严格又自由。