Search code examples
javaxmlsoapxpathwsdl

XPath select wsdl prefix namespaces


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

  1. Namespace xmlns="http://schemas.xmlsoap.org/wsdl/" represented as attribute of "definitions" element
  2. Namespace xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" represented as attribute of "definitions" element.

I tried XPath expressions:

  1. "//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?)
    
  2. "/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>

Solution

  • 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);