具有多种类型的元素的XML验证?

时间:2009-09-10 16:31:45

标签: xml validation xsd

我有一个可以有多种类型的元素(不是我的设计)。元素本身是一个带有一系列子元素的复杂类型,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是如何形成的?

2 个答案:

答案 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的帮助。