我有一个关于特殊的XML类型定义和值枚举的问题: 是否可以在枚举部分中引用另一个包含类型可能值的文件? 我的问题是,我必须定义具有数百个可能值的类型,而且可能的值的数量会动态变化。
答案 0 :(得分:2)
是否可以在枚举部分中引用另一个包含类型可能值的文件?
技术上,是的。正如@fly_ua指出的那样,您可以使用xs:import
或xs:include
将其他XML Schema文件导入/包含到您的架构中。
其他选项正在使用XML实体或XInclude之类的内容,但我不建议这样做,因为这可能会给XML Schema处理器带来麻烦。
我的问题是,我必须定义具有数百个可能值的类型,而且可能的值的数量会动态变化。
我强烈反对在这种情况下使用xs:enumeration
。如果值已修复且事先已知,则应使用枚举。这是架构的一部分,因此如果您更改这些值,则必须更改架构。
您正在寻找某种简单的动态方式。因此,当值发生变化时,您不必更改架构,只需要外部文件"。
没有"简单的动态方式"。
如果这些值是架构的一部分,则修复它们并将它们添加到架构中。这很容易,但不是动态的。
如果这些值必须是动态的,那么您每次发生任何更改时都必须发布新版本的架构,或者它们不是架构的一部分。
这是GML 3.2.1的一个例子。他们定义了一个名为CodeType
的类型:
<complexType name="CodeType">
<annotation>
<documentation>gml:CodeType is a generalized type to be used for a term, keyword or name.
It adds a XML attribute codeSpace to a term, where the value of the codeSpace attribute (if present) shall indicate a dictionary, thesaurus, classification scheme, authority, or pattern for the term.</documentation>
</annotation>
<simpleContent>
<extension base="string">
<attribute name="codeSpace" type="anyURI"/>
</extension>
</simpleContent>
</complexType>
它是一种简单的内容类型,具有额外的codeSpace
属性。该代码空间logicalz标识可以在这种情况下使用的一组代码。从技术上讲,这可能是一些字典文件的URl或一个众所周知的代码列表的ID。
只需将枚举列表置于架构外部并随意更改它将破坏使用XML实例的应用程序,除非它们遵循架构中的每个更改。这可能很难。
答案 1 :(得分:0)
选项是使用xs:import或xs:include但在这种情况下,您必须将一些完整的类型存储在单独的文件中并密切关注文件共享 - 例如XSD加载数据 - 写入文件。
另一个选项 - 动态更改枚举定义 - 您必须在应用程序中加载XmlSchema,导航到枚举定义facet并添加字典中可能存储在DB或其他任何位置的值
但是在概念上你可能不需要在枚举值动态变化的情况下验证枚举? Jsu验证了一些Regex或更简化的模式。