Reputation: 25
I am using XPath 1.0 in java and would like to select/check wsdl document namespaces, but unfortunately did not managed to do it. I would like to select
I tried XPath expressions:
"//namespace:: * " and "/*/namespace:: * ", which seem to be mystic, because they return:
"http: //www.w3.org/2001/XMLSchema",
"http: //www.w3.org/XML/1998/namespace" ????? (where does it come from?)
"/definitions/@*" returns:
HelloService
"http ://www.examples.com/wsdl/HelloService.wsdl"
Is there any way to catch xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" and xmlns="http://schemas.xmlsoap.org/wsdl/" attributes/namespaces in this document using XPath? or maybe some other tools? to check if node(attribute) or namespace value is equal to schemas.xmlsoap.org/wsdl/soap (kind of correct namespace control)
Wsdl document:
<definitions name="HelloService"
targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="SayHelloRequest">
<part name="firstName" type="xsd:string"/>
</message>
<message name="SayHelloResponse">
<part name="greeting" type="xsd:string"/>
</message>
<portType name="Hello_PortType">
<operation name="sayHello">
<input message="tns:SayHelloRequest"/>
<output message="tns:SayHelloResponse"/>
</operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="sayHello">
<soap:operation soapAction="sayHello"/>
<input>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</input>
<output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</output>
</operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
<soap:address location="http://www.examples.com/SayHello/"/>
</port>
</service>
</definitions>
Upvotes: 0
Views: 3125
Reputation: 1804
For the first one:
/*/namespace::*[name()='']
Result:http://schemas.xmlsoap.org/wsdl/
For the second one:
/*/namespace::*[name()='soap']
Result:http://schemas.xmlsoap.org/wsdl/soap/
You should remember to enable namespace support in java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true); //This is really important, without it that XPath does not work
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(inputSource); //inputSource, inputStream or file which contains your XML.
XPath xpath = XPathFactory.newInstance().newXPath();
String nameSpace = xpath.evaluate("/*/namespace::*[name()='']", document);
String soapNameSpace = xpath.evaluate("/*/namespace::*[name()='soap']", document);
Upvotes: 1