java - xsd 的 Java Saxon 有效子树
问题描述
使用 Saxon-HE 我想解析一个 xsd 文件,获取生成的树并从给定的元素名称获取生成的子树,以及所有必需的 simpleType 和 complexType(都使用类型引用和来自 ref),例如解析一个文件,如:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PSS" xmlns=""
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element maxOccurs="unbounded" name="Assistito">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="IDCittadino" type="IDCittadino"/>
<xs:element maxOccurs="unbounded" name="Struttura">
<xs:complexType>
<xs:sequence>
<xs:element name="CodiceStruttura" type="CodiceStruttura"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="IDCittadino">
<xs:restriction base="xs:string">
<xs:minLength value="20"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="CodiceStruttura">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
而且我需要从名称为“Struttura”的元素中获取子树,这还需要获取名称为“CodiceStruttura”的simpleType,例如:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PSS" xmlns=""
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Struttura">
<xs:complexType>
<xs:sequence>
<xs:element name="CodiceStruttura" type="CodiceStruttura"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="CodiceStruttura">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
笔记
- 一般来说,要保持一致的 xsd 应该保留 xs:element 中使用的所有类型,但您也可以使用“ref 属性”,这也应该考虑在内
- 我不想用 jaxb 或类似的生成类,因为 xsd 文件每次都会改变,所以我不能使用类生成
提前致谢,
解决方案
一般来说,我不建议使用模式文档的原始 XML,我建议使用模式编译器生成的模式组件模型,因为否则你会发现自己 (a) 复制模式编译器完成的所有工作,或 (b) 弄错了,并且没有正确处理所有模式。
您可以通过多种方式以编程方式访问模式组件模型。Saxon 提供了两种方法(但都需要 Saxon-EE)。(a) 您可以使用 Saxon 的模式处理器(使用com.saxonica.Validate -xsd:schema.xsd -scmout:schema.scm
)输出模式组件模型的 XML 表示。(b) 您可以使用一组扩展函数从 XSLT 或 XQuery 访问模式组件模型,以saxon:schema()
.
另一种选择是,Xerces 模式处理器为其内部模式组件模型提供了一个 Java API,您可以使用 Xalan(或者实际上是 Saxon)扩展函数来访问这个 API。
在所有这些情况下,可用的“模式组件模型”非常接近于 W3C XSD 规范中描述的抽象模式组件模型。与使用原始模式文档的主要区别包括 (a) 所有导入、包含和跨组件引用都已解决;(b) 所有默认值均已扩大;(c) 扩展了模型组和属性组。
推荐阅读
- python - 如何使用 Pandas 中的两个标准清理或平滑时间序列
- java - 将我的应用程序发布到 google playstore 后,我的应用程序无法获取 firestore 数据以回收分页视图
- c# - 更新特定目录中的图像文件
- python - 当用户尝试再次运行它时,如何在任务栏中最大化或激活打开的应用程序窗口?
- provider - 如何在 Monaco 编辑器中进行智能类型感知代码完成?
- salesforce - 使用 Azure 数据工厂将数据从 Azure SQL Server 复制到 Salesforce
- r - 为什么 read.csv 得到错误的类?
- function - 为tradingview编写pinescript函数的问题
- javascript - CSS 和 JS 不再适用于我的 Flask 应用程序
- java - 我可以将自定义字段添加到 liferay 中的帐户创建页面吗?