2009-09-10 47 views
0

我有一个元素可以有多种类型(不是我的设计)。元素本身是一个具有一系列子元素的复杂类型,XML是从一个属性的序列化生成的,并且该属性返回一个基类的类型。所以当生成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:类型?我一直在摆弄anyAttribute processContents,但我不相信这会有所帮助。

我会被卡住重新工作如何形成XML?

+0

看看你是如何得到它的工作是有用的,你可以回答自己的问题并接受它作为答案。至少这样,如果他们试图做类似的事情,它会给别人阅读完整的文章。 :) – 2009-09-11 10:05:51

+0

一旦我有100%的工作,我会做到这一点。我被困在最后一个问题上。 – Eves 2009-09-11 13:25:45

回答

1

检查this post如果没有其他内容会指出您进一步阅读。

如果您考虑进行转换,那么修改xml可能并不那么糟糕。通常你会遇到有问题的xml,原因是某些现有系统以这种方式导出它。使用xslt进行转换,可以让您保留传统xml,并将其以新格式用于新模式的验证。双重好处是你知道转换后的xml是有效的。

+0

感谢您的链接。我几乎有它的工作。 – Eves 2009-09-10 21:13:00

1

我一直无法让我的XML与我尝试过的任何形式的模式一起工作。它看起来像我几乎有关生成自己的“类型”属性,整个事情了,但最终我的事实,我的XML有:

 <Answer xsi:type="AnswerBool"> 
     <Value xsi:type="xsd:int">-1</Value> 
     </Answer> 

我无法处理“XSI:”部分的“类型“,因为我的属性只是”类型“,因此不符合”xsi:type“。我的模式实例都是一样的,所以我不知道为什么有问题。

所以我会改变的东西,让我不再有一个“答案”元素。我将有几十个不同的元素,每种类型一个。游民。

感谢您的帮助马克。