2012-05-16 10 views
5

Próbuję przeanalizować plik WSDL, aby uzyskać operacje, punkt końcowy i przykładowy ładunek. WSDL we wprowadzonym przez użytkownika. Nie mogę znaleźć samouczka, aby to zrobić.Prosty sposób analizy pliku WSDL

Mogę znaleźć tylko te, które generują kod źródłowy, którego nie potrzebuję. Próbowałem używać XBeans, ale najwyraźniej potrzebuję Saxona. Czy istnieje prosty, lekki sposób, aby to zrobić bez Saxona?

E.g.

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

powinien dostać operacje: GetLastTradePrice, GetLastTradePrice

Endpoint: StockQuotePort

Sample Ładowność:

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

To jakby co robi SoapUI. Ale głównie chodzi mi o to, aby móc analizować WSDL. Nieco więcej kontekstu polega na przesłaniu pliku WSDL, a następnie wyświetleniu wyniku w aplikacji GWT (przesyłanie pliku musi nastąpić w serwlecie). Więc muszę przeanalizować plik i utworzyć obiekt, który GWT będzie w stanie zrozumieć.

+0

Masz przykład wsdl? –

+2

Plik wsdl można analizować za pomocą analizatora składni XML, aby uzyskać potrzebne informacje. SAX jest bardzo lekki i łatwy do opanowania. Zobacz http://stackoverflow.com/questions/2134507/fast-lightweight-xml-parser – Pedantic

+0

Wygląda na to, że szukasz biblioteki, która może załatwić sprawę. SOAPUI ma kilka bibliotek, które można ponownie wykorzystać. Nie pamiętam nazw słoików/klas, ale udało mi się to z powodzeniem 1 rok temu. – Abhilash

Odpowiedz

7

To ładnie wygląda: http://www.membrane-soa.org/soa-model-doc/1.4/java-api/parse-wsdl-java-api.htm

nie działa na pierwszej próbie dla mnie chociaż, więc napisałem metodę, która zwraca sugerowane wyniki dla WSDL sample - bez zależności poza 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()]); 
} 

Wygląda na to, że chcesz usunąć duplikaty, ponieważ każda operacja jest wymieniona dwukrotnie w WSDL. To proste przy użyciu zestawu. Przesłano kompletny projekt Zaćmienie, który pokazuje zarówno unikalne, jak i nieunikalne wyniki: tutaj: https://github.com/sek/wsdlparser

0

Witam @Rebzie czy możesz używać JDOM jest bardzo łatwy i lekki. Używam parsowania pliku XML. Mam nadzieję, że ci pomogę. :)

0
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();  
} 
+0

Wiem, że to długo, ale mam nadzieję, że zadziała –