Вопрос по parsing, java – Простой способ разобрать WSDL

6

Я пытаюсь проанализировать WSDL, чтобы получить операции, конечную точку и пример полезной нагрузки. WSDL вводится пользователем. Я не могу найти учебник для этого.

Я могу найти только те, которые генерируют исходный код, который мне не нужен. Я пытался использовать XBeans, но, видимо, мне нужен Saxon. Есть ли простой способ сделать это без саксонцев?

Например.

   <?xml version="1.0"?>
  <definitions name="StockQuote"
  targetNamespace=
    "http://example.com/stockquote.wsdl"
  xmlns:tns="http://example.com/stockquote.wsdl"
  xmlns:xsd1="http://example.com/stockquote.xsd"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns="http://schemas.xmlsoap.org/wsdl/">
   <types>
   <schema targetNamespace=
     "http://example.com/stockquote.xsd"
     xmlns="http://www.w3.org/2000/10/XMLSchema">
      <element name="TradePriceRequest">
        <complexType>
           <all>
             <element name="tickerSymbol" 
               type="string"/>
           </all>
        </complexType>
      </element>
      <element name="TradePrice">
        <complexType>
          <all>
            <element name="price" type="float"/>
          </all>
        </complexType>
      </element>
   </schema>
   </types>
   <message name="GetLastTradePriceInput">
     <part name="body" element=
       "xsd1:TradePriceRequest"/>
   </message>
   <message name="GetLastTradePriceOutput">
     <part name="body" element="xsd1:TradePrice"/>
   </message>
   <portType name="StockQuotePortType">
     <operation name="GetLastTradePrice">
       <input message="tns:GetLastTradePriceInput"/>
       <output message="tns:GetLastTradePriceOutput"/>
     </operation>
   </portType>
     <binding name="StockQuoteSoapBinding"
       type="tns:StockQuotePortType">
       <soap:binding style="document"
         transport=
           "http://schemas.xmlsoap.org/soap/http"/>
     <operation name="GetLastTradePrice">
       <soap:operation
         soapAction=
           "http://example.com/GetLastTradePrice"/>
         <input>
           <soap:body use="literal"/>
         </input>
         <output>
           <soap:body use="literal"/>
         </output>
       </operation>
     </binding>
     <service name="StockQuoteService">
       <documentation>My first service</documentation>
       <port name="StockQuotePort" 
         binding="tns:StockQuoteBinding">
         <soap:address location=
           "http://example.com/stockquote"/>
       </port>
     </service>
    </definitions>

Должны получить операции: GetLastTradePrice, GetLastTradePrice

Конечная точка: StockQuotePort

Образец полезной нагрузки:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://example.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:TradePriceRequest/>
   </soapenv:Body>
</soapenv:Envelope>

Это похоже на то, что делает SoapUI. Но я в основном озабочен возможностью разбора WSDL. Немного больше контекста - загружается WSDL, а затем результат отображается в приложении GWT (загрузка файла должна идти в сервлет). Поэтому мне нужно проанализировать файл и создать объект, который GWT сможет понять.

Есть пример WSDL? Stan Kurdziel
Похоже, вы ищете библиотеку, которая может сделать свое дело. SOAPUI имеет несколько библиотек, которые вы можете использовать повторно. Я не помню названий банок / классов, но я сделал это успешно 1 год назад. Abhilash
Wsdl может быть проанализирован с использованием синтаксического анализатора XML, чтобы получить из него то, что вам нужно. SAX очень легкий и легкий в освоении. Увидетьstackoverflow.com/questions/2134507/fast-lightweight-xml-parser Pedantic

Ваш Ответ

4   ответа
0

Я использую easywsdl.

Место для начала

Maven:
<dependency>
  <groupId>org.ow2.easywsdl</groupId>
  <artifactId>easywsdl-wsdl</artifactId>
  <version>2.1</version>
</dependency>


// Read a WSDL 1.1 or 2.0
WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
Description desc = reader.read(new URL("http://file/path/document.wsdl"));
// Endpoints take place in services. 
// Select a service
Service service = desc.getServices().get(0);

// List endpoints
List<Endpoint> endpoints = service.getEndpoints(); 

// Read specific endpoint
//An endpoint has getBinding and then you getInterface from binding and so on
Endpoint specificEndpoint = service.getEndpoint("endpointName");

// Add endpoint to service
service.addEndpoint(specificEndpoint);

// Remove a specific enpoint
service.removeEndpoint("endpointName");

// Create endpoint
Endpoint createdEndpoint = service.createEndpoint();
service.addEndpoint(createdEndpoint);

My sample code:
    try {
        // Read a WSDL 1.1 or 2.0
        WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
        Description desc = reader.read(new URL("file:///C:/your/file/path/sample.wsdl"));
        // Endpoints take place in services. 
        // Select a service
        Service service = desc.getServices().get(0);
        List<Endpoint> endpoints = service.getEndpoints();
        //Gets address of first endpoint
        System.out.println(endpoints.get(0).getAddress());
        //Gets http method
        System.out.println(endpoints.get(0).getBinding().getBindingOperations().get(0).getHttpMethod());
        //Gets input type
        System.out.println(endpoints.get(0).getBinding().getInterface().getOperations().get(0).getInput().getElement().getType().getQName().getLocalPart());

    } catch (WSDLException | IOException | URISyntaxException e1) {
        e1.printStackTrace();
    }
Да, я могу получить список конечных точек, тип метода http и тип ввода.
-1

Привет @Rebzie вы можете использовать JDOM очень легко и легко. Я использую разбор XML-файла. Я надеюсь помочь вам. :)

8

Это выглядит красиво:http://www.membrane-soa.org/soa-model-doc/1.4/java-api/parse-wsdl-java-api.htm

Тем не менее, я не работал с первой попытки, поэтому я написал метод, который возвращает предложенные результаты для образца wsdl - никаких зависимостей вне J2SE6.

public String[] listOperations(String filename) throws FileNotFoundException, SAXException, IOException, ParserConfigurationException {
  Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(filename));
  NodeList elements = d.getElementsByTagName("operation");
  ArrayList<String> operations = new ArrayList<String>();
  for (int i = 0; i < elements.getLength(); i++) {
    operations.add(elements.item(i).getAttributes().getNamedItem("name").getNodeValue());
  }
  return operations.toArray(new String[operations.size()]);
}

Похоже, вы хотели бы удалить дубликаты, поскольку каждая операция перечисляется дважды в WSDL. Это легко с помощью набора. Загруженный полный проект затмения, который показывает уникальные и неуникальные результаты здесь:https://github.com/sek/wsdlparser

-1
 private static String getMethodNameFromWSDL(String wsdlPath) throws FileNotFoundException, SAXException, IOException, ParserConfigurationException {

        String tagPrefix = null;
        String namespace =null;
        String location = null;
        NodeList nd = null;
        Set<String> operations = new HashSet<String>(); 
        NodeList nodeListOfOperations = null;
        String attr ="http://www.w3.org/2001/XMLSchema"

        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(convertURLToString(wsdlPath).getBytes()));

        NodeList allNodesOfDocumnet = document.getChildNodes();

        for(int index = 0;index<allNodesOfDocumnet.getLength();index++){
            if( document.getFirstChild().getNodeName().equalsIgnoreCase("#comment")){
                    document.removeChild(document.getFirstChild());
            }    
        }

       int l =  document.getFirstChild().getAttributes().getLength();
       for (int i = 0; i < l; i++) {
         String cmpAttribute =  document.getFirstChild().getAttributes().item(i).getNodeValue();
             if(cmpAttribute.equals(attr)){
                 tagPrefix =  document.getFirstChild().getAttributes().item(i).getNodeName().replace("xmlns:", "");
             }
        }

        System.out.println(tagPrefix);
        String str1=tagPrefix+":import";
        String str2="wsdl:import";
        String str3 ="operation"; 
        String str4 ="wsdl:operation"; 
        // Getting Namespace
                if((document.getElementsByTagName(str1).getLength()>0)||(document.getElementsByTagName(str2).getLength()>0)){

                            if(document.getElementsByTagName(tagPrefix+":import").getLength()>0)
                                 nd =document.getElementsByTagName(tagPrefix+":import");

                            else if (document.getElementsByTagName("wsdl:import").getLength()>0) 
                                 nd =document.getElementsByTagName("wsdl:import");  

                            for (int k = 0; k < nd.item(0).getAttributes().getLength(); k++) {
                                String strAttributes = nd.item(0).getAttributes().item(k).getNodeName();

                                if(strAttributes.equalsIgnoreCase("namespace")){
                                    namespace = nd.item(0).getAttributes().item(k).getNodeValue();
                                    System.out.println("Namespace : "+namespace);
                                }
                                else {
                                     location = nd.item(0).getAttributes().item(k).getNodeValue();
                                     System.out.println("Location : "+location);
                                }

                            }
                }else{
                        namespace = document.getFirstChild().getAttributes().getNamedItem("targetNamespace").getNodeValue();
                        System.out.println("Namespace : "+namespace);
                    }   



                //Getting  Operations 

                 if((document.getElementsByTagName(str3).getLength()>0)||(document.getElementsByTagName(str4).getLength()>0)){

                    if(document.getElementsByTagName(str3).getLength()>0){
                        nodeListOfOperations =document.getElementsByTagName(str3);
                    }
                    else if (document.getElementsByTagName(str4).getLength()>0) {
                         nodeListOfOperations =document.getElementsByTagName(str4);
                    }
                    for (int i = 0; i < nodeListOfOperations.getLength(); i++) {
                            operations.add(nodeListOfOperations.item(i).getAttributes().getNamedItem("name").getNodeValue()); 
                    }

                }   

            if(location!=null){ 
                if(operations.isEmpty()){   
                    Document documentForOperation = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(convertURLToString(location).getBytes()));
                    NodeList nodesOfNewDoc = documentForOperation.getC,hildNodes();
                    for(int index = 0;index<nodesOfNewDoc.getLength();index++){
                        if( documentForOperation.getFirstChild().getNodeName().equalsIgnoreCase("#comment")){
                                document.removeChild(document.getFirstChild());
                        }       
                    }

                    NodeList nodeList  = documentForOperation.getElementsByTagName(str4);
                    for (int i = 0; i < nodeList.getLength(); i++) {
                        operations.add(nodeList.item(i).getAttributes().getNamedItem("name").getNodeValue()); 
                    }
                }

            }

            for (String string : operations) {
                System.out.println(string);
            }
       System.out.println(operations.toString());           
        return operations.toString();           
    }

public static String convertURLToString(String url){

    StringBuilder response = null;  

    try {    

        URL urlObj = new URL(url);
        URLConnection urlConnection = urlObj.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.connect();    
        //urlConnection.setConnectTimeout(30000);       
        BufferedReader reader = new BufferedReader(new 
           InputStreamReader(urlConnection.getInputStream()));
        response = new StringBuilder();
        String inputLine;

        while ((inputLine =, reader.readLine()) != null){
            response.append(inputLine);
        }

        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

    return response.toString();     
}
Я знаю, это долго, но, надеюсь, это будет работать

Похожие вопросы