An easy way to parse WSDL

I am trying to parse WSDL to get operations, endpoint and payload example. WSDL entered by the user. I can not find a tutorial for this.

I can only find those that generate source code that I don't need. I tried using XBeans, but apparently I need a saxon. Is there a simple easy way to do this without Saxon?

eg.

<?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> 

Must get operations: GetLastTradePrice, GetLastTradePrice

Endpoint: StockQuotePort

Payload Example:

 <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> 

This is similar to what SoapUI does. But I'm mostly worried about the possibility of WSDL analysis. A little more context: WSDL is loaded, and then the result is displayed in the GWT application (file upload should go to the servlet). So I need to parse the file and create an object that GWT can understand.

+6
source share
4 answers

It looks beautiful: http://www.membrane-soa.org/soa-model-doc/1.4/java-api/parse-wsdl-java-api.htm

It does not work for the first attempt for me, therefore, therefore I wrote a method that returns the suggested results for the wsdl sample - without dependencies outside of 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()]); } 

It looks like you would like to remove duplicates, since each operation appears twice in the WSDL. It is easy to use Set. The uploaded full eclipse project, which shows both unique and inimitable results here: https://github.com/sek/wsdlparser

+8
source

I am using easywsdl.

Place to start

 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: WSDLReader reader = WSDLFactory.newInstance().newWSDLReader(); Description desc = reader.read(new URL("file:///C:/your/file/path/example.wsdl")); // Endpoints take place in services. // Select a service Service service = desc.getServices().get(0); List<Endpoint> endpoints = service.getEndpoints(); System.out.println(endpoints.get(0).getAddress()); System.out.println(endpoints.get(0).getBinding().getBindingOperations().get(0).getHttpMethod()); System.out.println(endpoints.get(0).getBinding().getInterface().getOperations().get(0).getInput().getElement().getType().getQName().getLocalPart()); 
0
source

Hi @Rebzie you can use JDOM very easily and easily. I am using XML file parsing. I hope to help you. :)

-1
source
  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.getChildNodes(); 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(); } 
-1
source

Source: https://habr.com/ru/post/893713/


All Articles