假设我有一个名为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
进行验证时,我只想序列化xsd1
和Prop1
。
答案 0 :(得分:0)
您的问题类似于架构版本控制问题,您在添加新元素时同时寻求向前和向后兼容性。这根本不可能。
添加可选元素允许对XSD 1 有效的XML继续对新版本XSD 2 有效。那部分没问题。但是,任何包含可选新元素的XML对原始版本XSD 1 都无效。
当我发布新架构时,客户需要时间来调整其代码。
足够公平 - 一个共同的要求。
我们的客户向我们发送数据(对象,而不是xml)
这与建议的最佳做法相反。
他们确定应该验证哪个架构
然后通过在转换期间支持两个XSD来履行他们的承诺(而不是试图打败它),或通过xsd:any
等自由机制为您的XSD建立灵活性。这取决于你,但你不能指望验证既严格又自由。