2012-05-16 24 views
5

Estoy tratando de analizar un WSDL para obtener las operaciones, punto final y una carga de ejemplo. El WSDL ingresado por el usuario. No puedo encontrar un tutorial para hacer esto.Forma simple de analizar un WSDL

Solo puedo encontrar los que generan código fuente que no necesito. He intentado usar XBeans, pero aparentemente necesito Saxon. ¿Hay una forma simple y ligera de hacerlo sin Saxon?

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> 

debe recibir operaciones: GetLastTradePrice, GetLastTradePrice

Punto final: StockQuotePort

Carga de la muestra:

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

Esto es como lo que hace SoapUI. Pero lo que más me preocupa es poder analizar el WSDL. Un poco más de contexto es que el WSDL se carga y luego el resultado se muestra en una aplicación GWT (la carga del archivo debe ir al servlet). Entonces, necesito analizar el archivo y crear un objeto que GWT pueda entender.

+0

¿Tiene un ejemplo wsdl? –

+2

El wsdl se puede analizar usando un analizador XML para obtener lo que necesita de él. SAX es muy liviano y muy fácil de aprender. Ver http://stackoverflow.com/questions/2134507/fast-lightweight-xml-parser – Pedantic

+0

Parece que está buscando una biblioteca que puede hacer el truco. SOAPUI tiene algunas bibliotecas que puedes reutilizar. No recuerdo los nombres de jar/class, pero lo hice con éxito hace 1 año. – Abhilash

Respuesta

7

Esto se ve bien: http://www.membrane-soa.org/soa-model-doc/1.4/java-api/parse-wsdl-java-api.htm

no funcionó en el primer intento para mí, sin embargo, así que escribí un método que devuelve los resultados sugeridos para el WSDL de muestra - sin dependencias fuera del 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()]); 
} 

parece como que se quiere eliminar los duplicados, ya que cada operación aparece dos veces en el WSDL. Eso es fácil usando un Set. Proyecto eclipse completo cargado que muestra resultados únicos y no exclusivos aquí: https://github.com/sek/wsdlparser

0

Hola @Rebzie puedes usar JDOM es muy fácil y liviano. Yo uso el análisis de archivo XML. Espero ayudarte :)

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

Sé que es muy largo, pero espero que funcione –

Cuestiones relacionadas