gpt4 book ai didi

java - 解析 WSDL 的简单方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:36 27 4
gpt4 key购买 nike

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

最佳答案

这看起来不错: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

关于java - 解析 WSDL 的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10611034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com