首页 > 解决方案 > 使用 java 从 XSD 文档中提取限制

问题描述

是否可以使用java以编程方式获取应用于 XSD 文件中 XSD 元素的限制值?在下面的 XSD 示例中,如何提取与名为“code1”的元素相关的模式值

''' <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<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/\-\?:\(\)\.,&apos;\+ ]{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>

</xs:schema> '''

标签: javaxmlxsdxml-parsingjaxb

解决方案


这取决于您对架构了解多少。如果您知道除了模式之外的所有内容,那么编写 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,命名模型组和属性组,取代基团等


推荐阅读