使用 java 从 XSD 文档中提取限制
Extraction of Restrictions from an XSD document using java
是否可以使用 java 以编程方式获取应用于 XSD 文件中 XSD 元素的限制值?
在下面的 XSD 示例中,我如何提取与名称为“code1”的元素相关的模式值?
'''
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="stringMaxSize5"/>
<xs:element name="age" type="stringMaxSize2"/>
<xs:element name="code1" type="Text_FIN_16x_Type"/>
<xs:element name="code2" type="Identifier_FIN_4Ea_Type"/>
<xs:element ref="phone-number" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="phone-number">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:simpleType name="stringMaxSize5">
<xs:restriction base="xs:string">
<xs:maxLength value="5"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="stringMaxSize2">
<xs:restriction base="xs:string">
<xs:maxLength value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Text_FIN_16x_Type">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="16"/>
<xs:pattern value="[0-9a-zA-Z/\-\?:\(\)\.,'\+ ]{1,16}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Identifier_FIN_4Ea_Type">
<xs:restriction base="xs:string">
<xs:minLength value="4"/>
<xs:maxLength value="4"/>
<xs:pattern value="[A-Z]{4}"/>
</xs:restriction>
</xs:simpleType>
'''
这取决于您对架构的了解程度。如果您知道除了模式之外的所有内容,那么编写 XPath 表达式将非常容易。
如果您只知道类型名称“Text_FIN_16x_Type”,那么它就更难了(因为,例如,该类型可能被定义为一个联合类型,或者定义为一些其他全局类型的限制,或作为本地匿名类型的限制)。
我只知道元素名称“code1”,这就更难了,因为定义元素类型的方法有很多种 - 甚至不能保证只有一个声明“ code1”在架构中(在您的架构中,它是本地元素声明,因此不必具有全局唯一名称)。
通常,如果您尝试访问已由架构处理器处理过的已编译架构,您的机会会大得多。如果你在 Java 那么你可以考虑:
(a) Xerces 模式访问 API (https://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/)
(b) Saxon SCM 文件格式,将已编译的架构组件模型表示为 XML 文档。
(c) saxon:schema() 扩展函数,它提供了一个 XPath API 来探索已编译的模式。
进入这个级别的好处是有很多细节你不需要担心,因为它们已经被处理好了 - xs:include 和 xs:import, 命名模型组和属性组,替换组等
是否可以使用 java 以编程方式获取应用于 XSD 文件中 XSD 元素的限制值? 在下面的 XSD 示例中,我如何提取与名称为“code1”的元素相关的模式值?
'''
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="stringMaxSize5"/>
<xs:element name="age" type="stringMaxSize2"/>
<xs:element name="code1" type="Text_FIN_16x_Type"/>
<xs:element name="code2" type="Identifier_FIN_4Ea_Type"/>
<xs:element ref="phone-number" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="phone-number">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:simpleType name="stringMaxSize5">
<xs:restriction base="xs:string">
<xs:maxLength value="5"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="stringMaxSize2">
<xs:restriction base="xs:string">
<xs:maxLength value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Text_FIN_16x_Type">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="16"/>
<xs:pattern value="[0-9a-zA-Z/\-\?:\(\)\.,'\+ ]{1,16}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Identifier_FIN_4Ea_Type">
<xs:restriction base="xs:string">
<xs:minLength value="4"/>
<xs:maxLength value="4"/>
<xs:pattern value="[A-Z]{4}"/>
</xs:restriction>
</xs:simpleType>
'''
这取决于您对架构的了解程度。如果您知道除了模式之外的所有内容,那么编写 XPath 表达式将非常容易。
如果您只知道类型名称“Text_FIN_16x_Type”,那么它就更难了(因为,例如,该类型可能被定义为一个联合类型,或者定义为一些其他全局类型的限制,或作为本地匿名类型的限制)。
我只知道元素名称“code1”,这就更难了,因为定义元素类型的方法有很多种 - 甚至不能保证只有一个声明“ code1”在架构中(在您的架构中,它是本地元素声明,因此不必具有全局唯一名称)。
通常,如果您尝试访问已由架构处理器处理过的已编译架构,您的机会会大得多。如果你在 Java 那么你可以考虑:
(a) Xerces 模式访问 API (https://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/)
(b) Saxon SCM 文件格式,将已编译的架构组件模型表示为 XML 文档。
(c) saxon:schema() 扩展函数,它提供了一个 XPath API 来探索已编译的模式。
进入这个级别的好处是有很多细节你不需要担心,因为它们已经被处理好了 - xs:include 和 xs:import, 命名模型组和属性组,替换组等