java - 使用 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/\-\?:\(\)\.,'\+ ]{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> '''
解决方案
这取决于您对架构了解多少。如果您知道除了模式之外的所有内容,那么编写 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,命名模型组和属性组,取代基团等
推荐阅读
- c++ - C++ Code::Blocks 程序从命令行运行时导致蓝屏
- windows - 批处理:如何在不扩展变量的情况下将文本写入文件
- reactjs - 如何使 React Bootstrap 4 Carousel 上的文本保持不动,而图像移动?
- ios - Flutter:iOS 构建失败
- flutter - 渲染到视频 - Flutter
- python - split() 将哪些字符视为空格?
- javascript - if 语句给出相同的输出 如果输入框中有值,则 IF 的第一部分有效,它不会显示正确的消息
- java - 使用@beforeeach 设置一次测试代码
- javascript - 如何将变量传递给多层组件?前任。传递到 productCard 页面,然后传递到产品页面以显示所有卡片
- python - 按键后Python退出代码执行