是否可以组合显式属性验证和anyAttribute

时间:2011-06-06 09:09:49

标签: xml xsd xml-attribute

是否可以在XML模式中定义必须存在某些XML属性,同时我希望以后允许扩展此列表?

在这里,如果我们有XML声明的以下假设部分:

<xs:element name="MyTypeInstance" type="MyType" />

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required"/>
  <xs:attribute name="SecondAttr" type="xs:string" use="required"/>
</xs:complexType>

然后,根据此模式,以下XML文档片段有效:

<MyType firstAttr="123" secondAttr="abc" />

我想要的是能够成功验证以下XML片段:

<MyType firstAttr="123" secondAttr="abc" ThirdAttr="some new value" />

两个主要问题是:

  1. 我不想在每次需要引入一些新属性时更改XML模式,因为我们不想强制所有客户端更新到我们软件的最新版本,其中一些不会很长一段时间更新他们的应用程序;
  2. 我不能在XML模式中使用anyAttribute因为我想在使用之前验证XML文档。如果我只指定anyAttribute元素,那么我不知道缺少一些必需的属性。据我所知,XML不允许在架构中使用attributeanyAttribute元素(至少我无法使用.net XmlDocument类使这种架构工作)。
  3. 如果可以使用attribute元素明确指定一些属性,那将是理想的,所以我确切地知道这些属性存在于XML文档中,但同时我会让XML扩展使用anyAttribute元素的文档。

    怎么做?

2 个答案:

答案 0 :(得分:3)

xs:anyattribute的{​​{1}}值可以是processContentsstrictlax,默认为skip

  • strict:必须有相应的全局属性声明,并且该属性将根据该声明进行验证
  • strict:如果有相应的全局属性声明,则验证该属性;否则跳过它
  • lax:即使有声明
  • ,也不要验证属性

如果您的下一版本的架构看起来像

skip

(你没有使用全局属性),那么<xs:complexType name="MyType"> <xs:attribute name="FirstAttr" type="xs:int" use="required" /> <xs:attribute name="SecondAttr" type="xs:string" use="required" /> <xs:attribute name="ThirdAttr" type="xs:string" use="required" /> <xs:anyAttribute processContents="lax" /> </xs:complexType> 可能最好确保添加的属性不会意外地验证碰巧具有相同名称和可能不同类型的全局属性声明

答案 1 :(得分:1)

好的,我已经解决了这个问题。架构可能如下所示:

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required" />
  <xs:attribute name="SecondAttr" type="xs:string" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

关键是指定processContents="lax"processContents="skip"。如果省略将processContents设置为laxskip,则验证失败。如果有人知道这背后的逻辑,请提出一些意见。