Простой способ анализа WSDL
Я пытаюсь проанализировать WSDL, чтобы получить операции, конечную точку и полезную нагрузку примера. WSDL, введенный пользователем. Я не могу найти учебник для этого.
Я могу найти только те, которые генерируют исходный код, который мне не нужен. Я пробовал использовать XBeans, но, видимо, мне нужен Saxon. Есть ли простой легкий способ сделать это без 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 сможет понять.
3 ответов
Это выглядит красиво: 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. Это легко использовать набор. Загруженный полный проект eclipse, который показывает оба уникальные и не уникальные результаты здесь: https://github.com/sek/wsdlparser
Привет @Rebzie вы можете использовать JDOM очень легко и легко. Я использую синтаксический анализ XML-файла. Я надеюсь помочь вам. :)
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();
}