2012-05-16 53 views
5

我想解析一个WSDL以获取操作,端点和示例负载。 WSDL由用户输入。我无法找到一个教程来做到这一点。解析WSDL的简单方法

我只能找到那些生成我不需要的源代码。我试过使用XBeans,但显然我需要撒克逊。有没有一个简单的轻量级方法来做到这一点,没有撒克逊?

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> 

应该得到操作: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应用程序中(文件上传必须转到servlet)。所以我需要解析这个文件并创建一个GWT能够理解的对象。

+0

有一个例子wsdl? –

+2

可以使用XML解析器分析wsdl以获取您需要的内容。 SAX非常轻便,学习起来很轻松。看到http://stackoverflow.com/questions/2134507/fast-lightweight-xml-parser – Pedantic

+0

好像你正在寻找图书馆可以做的伎俩。 SOAPUI有一些你可以重用的库。我不记得jar/class的名字,但是我在1年前成功地完成了它。 – Abhilash

回答

7

这看起来不错: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中列出两次。使用Set很容易。上传完整的eclipse项目,在这里显示独特和非独特的结果:https://github.com/sek/wsdlparser

0

嗨@Rebzie你可以使用JDOM是非常容易和轻量级的。我使用解析XML文件。我希望能帮助你。 :)

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

我知道它很长,但希望它能起作用 –