是否可以在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" />
两个主要问题是:
anyAttribute
因为我想在使用之前验证XML文档。如果我只指定anyAttribute
元素,那么我不知道缺少一些必需的属性。据我所知,XML不允许在架构中使用attribute
和anyAttribute
元素(至少我无法使用.net XmlDocument
类使这种架构工作)。如果可以使用attribute
元素明确指定一些属性,那将是理想的,所以我确切地知道这些属性存在于XML文档中,但同时我会让XML扩展使用anyAttribute
元素的文档。
怎么做?
答案 0 :(得分:3)
xs:anyattribute
的{{1}}值可以是processContents
,strict
或lax
,默认为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
设置为lax
或skip
,则验证失败。如果有人知道这背后的逻辑,请提出一些意见。