java - 使用 Java 从 URL 读取 XSD

标签 java xsd wsdl wsdl4j

目标:我想阅读 WSDL 并打印 WSDL 中的服务、复杂类型和复杂类型定义。

有效:我使用 WSDL4J 读取 WSDL 并成功打印服务及其参数(复杂类型)。现在我想阅读 XSD 中可用的复杂类型定义。我无法读取 XSD。有什么办法可以做到这一点吗?

我得到的 XSModel 为 null

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import javax.wsdl.BindingOperation;
import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import javax.wsdl.xml.WSDLReader;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;

import com.ibm.wsdl.BindingImpl;
import com.ibm.wsdl.xml.WSDLReaderImpl;
import com.sun.org.apache.xerces.internal.impl.xs.XSImplementationImpl;
import com.sun.org.apache.xerces.internal.xs.XSLoader;
import com.sun.org.apache.xerces.internal.xs.XSModel;

public class WSDLDetails {

    public static void main(String[] args) {
        try {
            String wsdlURL = "https://abc.xyz.com/webservice/MessagingSevice?WSDL";
            String xsdURL = "https://abc.xyz.com/webservice/MessagingSevice?xsd=1";
            java.lang.System.setProperty("https.protocols", "TLSv1.2");
            getAllBindingOperation(wsdlURL);
            readXSD(xsdURL);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static List<String> getAllBindingOperation(String wsdlUrl) {
        List<BindingOperation> operationList = new ArrayList();
        List<String> nameList = new ArrayList();
        try {
            WSDLReader reader = new WSDLReaderImpl();
            reader.setFeature("javax.wsdl.verbose", false);
            Definition definition = reader.readWSDL(wsdlUrl.toString());
            Map<String, BindingImpl> defMap = definition.getAllBindings();
            Collection<BindingImpl> collection = defMap.values();
            for (BindingImpl binding : collection) {
                operationList.addAll(binding.getBindingOperations());
            }
            for (BindingOperation operation:operationList) {
                nameList.add(operation.getName());
                System.out.println("Name     :: " + operation.getName());
                System.out.println("Request  :: " + operation.getBindingInput());
                System.out.println("Response :: " + operation.getBindingOutput());
            }
        } catch (WSDLException e) {
            System.out.println("get wsdl operation fail.");
            e.printStackTrace();
        }
        return nameList;
    }

    public static void readXSD(String xsdURL) {
        try {
            System.setProperty(DOMImplementationRegistry.PROPERTY, "com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl");
            DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 
            com.sun.org.apache.xerces.internal.impl.xs.XSImplementationImpl impl = (XSImplementationImpl) registry.getDOMImplementation("XS-Loader");
            XSLoader schemaLoader = impl.createXSLoader(null);
            XSModel model = schemaLoader.loadURI(xsdURL);
            System.out.println(model);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最佳答案

你可以在maven中使用xsd2java插件 https://github.com/qaware/xsd2java-gradle-plugin

关于java - 使用 Java 从 URL 读取 XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796901/

相关文章:

xml - emacs 中基于 W3C XML 模式的模式敏感编辑? (不是随机数)

web-services - soapUI 结合了更多模拟服务

java - Fitness.API 在 Google Play Services 7.0 中被移除了吗?

java - 在java中是否有一个实用程序可以在没有检查异常的情况下解析URL?

java - ByteArrayOutputStream 和 BufferedOutputStream 的区别

java - 保存下载的 XSD 和 WSDL

javafx - 当选择一个时 TableView 中的复选框,行中的其他复选框被禁用

xsd - xsi :schemaLocation? 有什么用

java - 将 java 应用程序部署到 weblogic 时出错

c# - HTML 文档不包含 Web 服务发现信息