如何使用 XERCES2 从 XSD 访问任何元素并获取其数据类型和其他相关信息

问题描述

我想解析我的 XSD 并从中获取元素和数据类型。我正在寻找某种机制,我可以在其中传递 element 名称并为其获取 datatype

搜索一个高效且高性能的开源库后,我发现 XERCES2 将是一个不错的选择。因此,我使用 XERCES2 来解析我的 XSD。我有点卡在我无法绕过 datatype 获得元素的 element name 的地方。如果有人能就此提供一些指导,那就太好了。

我想获取元素 typename

以下是我的 XSD:

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="breakfast_menu">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="food">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string" />
                            <xs:element name="price" type="xs:string" />
                            <xs:element name="description" type="xs:string" />
                            <xs:element name="calories" type="xs:unsignedShort" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema> 

以下是我的 Java 代码,我在其中传递 XSD 文件的位置并使用 XERCES2 对其进行解析:

public class Xerces2Parser {

    public static void main(String[] args) throws URISyntaxException,ClassNotFoundException,InstantiationException,illegalaccessexception,ClassCastException,IOException {
        String xsdpath = Paths.get(Xerces2Parser.class.getClassLoader().getResource("test.xsd").toURI()).toFile().getAbsolutePath();
        String filePath = Path.of(xsdpath).toString();
        InputStream inputStream = new FileInputStream(filePath);
        // System.out.println(readFromInputStream(inputStream));

        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
        XSImplementation impl = (XSImplementation) registry.getDOMImplementation("XS-Loader");
        XSLoader schemaLoader = impl.createXSLoader(null);
        LSInput input = new DOMInputImpl();
        input.setByteStream(inputStream);
        XSModel model = schemaLoader.load(input);
        XSElementDeclaration decl = model.getElementDeclaration("name","");
        XSTypeDeFinition model1 = model.getTypeDeFinition("name","");
        System.out.println(model1);

        XSElementDeclaration elementDec = (XSElementDeclaration) model.getTypeDeFinition("breakfast_menu",null);
        System.out.println(elementDec);
    }
}

另外,我有一个问题: 我有一个 XML 文件,我正在使用 SAX 解析器为每个我想从 XSD 知道类型的元素解析该文件。因此,我这样做是为了知道 XERCES2 是否是最佳选择,或者我可以使用其他库 SAXON

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)