首页 文章

XPath选择wsdl前缀命名空间

提问于
浏览
0

我在java中使用XPath 1.0,并希望选择/检查wsdl文档命名空间,但遗憾的是没有设法做到这一点 . 我想选择

  • 命名空间xmlns = "http://schemas.xmlsoap.org/wsdl/"表示为"definitions"元素的属性

  • 命名空间xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"表示为"definitions"元素的属性 .

我试过XPath表达式:

  • “// namespace :: *”和“/ * / namespace :: *”,这似乎是神秘的,因为它们返回:
"http: //www.w3.org/2001/XMLSchema", 
"http: //www.w3.org/XML/1998/namespace" ????? (where does it come from?)
  • “/ definitions / @ *”返回:
HelloService
"http ://www.examples.com/wsdl/HelloService.wsdl"

有没有办法在本文档中使用xmlns:soap =“http://schemas.xmlsoap.org/wsdl/soap/”和xmlns =“http://schemas.xmlsoap.org/wsdl/”属性/命名空间XPath的?或者其他一些工具?检查node(attribute)或namespace值是否等于schemas.xmlsoap.org/wsdl/soap(一种正确的名称空间控件)

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>

1 回答

  • 0

    对于第一个:

    /*/namespace::*[name()='']
    

    结果:http://schemas.xmlsoap.org/wsdl/

    对于第二个:

    /*/namespace::*[name()='soap']
    

    结果:http://schemas.xmlsoap.org/wsdl/soap/

    您应该记得在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);
    

相关问题