我有一个可以有多种类型的元素(不是我的设计)。元素本身是一个带有一系列子元素的复杂类型,XML是从属性的序列化生成的,该属性返回一种基类。因此,当生成XML时,类型最终会在XML中设置为对象的真实位置。例如:
<Answer xsi:type="AnswerBool">
<Value xsi:type="xsd:int">-1</Value>
</Answer>
或者可能是:
<Answer xsi:type="AnswerString">
<Value xsi:type="xsd:string">-1</Value>
</Answer>
C#属性如下所示:
public AnswerBase Answer
{
get { return mViewAnswer; }
set { mViewAnswer = value; }
}
因此,如果变量nViewAnswer的类型为AnswerBool,则序列化时会生成第一个XML示例。如果它是AnswerString类型,则生成第二个XML检查。
所以我一直在研究XML的某种XSD。但是,当涉及到验证时,我似乎无法使其工作。显然,一种选择是改变XML的结构方式并具有“Answer”元素的子元素。但是,这需要重新处理我希望尽可能避免的现有功能。所以....
有没有办法让一个元素在模式中定义了不同的类型?
或者有没有办法设置XSD,以便在验证期间忽略该元素的xsi:type?我一直在摆弄anyAttribute processContents,但我不相信这会有所帮助。
我将不得不重新研究XML是如何形成的?
答案 0 :(得分:1)
检查this post,如果没有其他内容可以指向您进一步阅读。
如果考虑进行转换,重写xml可能不是那么糟糕。通常你会遇到有问题的xml,原因是一些现有的系统以这种方式导出它。使用xslt进行转换,可以让您保留旧版xml,并使用新格式对新架构进行验证。双重奖励是您知道转换的xml有效。
答案 1 :(得分:1)
我无法让我的XML与我尝试的任何形式的架构一起使用。看起来我几乎已经完成了关于生成我自己的“类型”属性的所有事情,但最终我的事实是我的XML:
<Answer xsi:type="AnswerBool">
<Value xsi:type="xsd:int">-1</Value>
</Answer>
我无法处理“type”的“xsi:”部分,因为我的属性只是“type”,因此与“xsi:type”不匹配。我的架构实例都是一样的,所以我不知道为什么会出现问题。
所以我会改变一些事情,以便我不再拥有一个“答案”元素。我将有几十个不同的元素,每种类型一个。长号。
感谢Mark的帮助。