另一个文件中可能值的XML-Schema枚举

时间:2014-12-11 09:53:56

标签: xml xsd enumeration

我有一个关于特殊的XML类型定义和值枚举的问题: 是否可以在枚举部分中引用另一个包含类型可能值的文件? 我的问题是,我必须定义具有数百个可能值的类型,而且可能的值的数量会动态变化。

2 个答案:

答案 0 :(得分:2)

  

是否可以在枚举部分中引用另一个包含类型可能值的文件?

技术上,是的。正如@fly_ua指出的那样,您可以使用xs:importxs: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或更简化的模式。