首页 > 解决方案 > 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>

笔记

提前致谢,

标签: javaparsingxsdxml-parsingsaxon

解决方案


一般来说,我不建议使用模式文档的原始 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) 扩展了模型组和属性组。


推荐阅读