0

是否可以在 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. 我不能只anyAttribute在 XML 模式中使用,因为我想在使用 XML 文档之前对其进行验证。如果我只指定anyAttribute元素,那么我就不会知道缺少一些必需的属性。据我了解,XML 不允许在模式中使用attributeanyAttribute元素(至少我无法使用 .netXmlDocument类使这样的模式工作)。

如果可以使用attributeelement 显式指定一些属性,那将是理想的,所以我会确切地知道这些属性存在于 XML 文档中,但同时我会允许使用anyAttributeelement 扩展 XML 文档。

怎么做到呢?

4

2 回答 2

3

xs:anyattribute可以有一个processContentsstrictlax或者skipstrict作为默认值。

  • 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>

(您没有使用全局属性),那么skip最好确保添加的属性不会意外地针对碰巧具有相同名称和可能不同类型的全局属性声明进行验证。

于 2011-06-07T02:19:07.227 回答
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"or processContents="skip"。如果省略设置processContentslaxskip验证失败。如果有人知道这背后的逻辑,请发表一些评论。

于 2011-06-06T09:54:14.893 回答