`

wsdl文件的导入

 
阅读更多

导入(Import)语句很简单,对吗?差不多每个程序或接口语言都用到它。当你阅读这篇技巧时,可能早已了解了关于导入的所有知识。那么,为什么要阅读这篇关于 Web 服务描述语言(Web Services Description Language,WSDL)文件导入的技巧呢?首先,import 语句有两种类型:XSD 导入和 WDSL 导入。其次,这两种导入语句各自的特点不完全相同。最后,应该搞清楚这两者之间的联系。

Import 与 include

在深入描述 import 语句之前,让我们先来比较一下 import 和 include 之间的区别。import 语句引入其他的命名空间(namespace),但 include 语句却是将其他的声明引入到当前命名空间中。


XSD 导入

让我们来查看基本 XSD 导入,如清单 1 中用红色突出显示的部分所示。这部分语句做的全部事情就是将命名空间从一个模式导入到另一个模式。定义了 urn:listing2 命名空间的模式导入 urn:listing3 模式 。仅此而已,没有任何文件被导入。这两个模式都在清单 1 中的同一个文件内。


清单 1. 使用两个命名空间的地址簿 WSDL

<?xml version="1.0" ?>
<wsdl:definitions targetNamespace="urn:listing2"
                  xmlns:tns="urn:listing2"
                  xmlns:listing3="urn:listing3"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <xsd:schema targetNamespace="urn:listing3"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      
                    <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>

                
      <xsd:complexType name="Phone">
        <xsd:sequence>
          <xsd:element name="areaCode" type="xsd:int"/>
          <xsd:element name="exchange" type="xsd:int"/>
          <xsd:element name="number" type="xsd:int"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
    <xsd:schema targetNamespace="urn:listing2"
                xmlns:listing3="urn:listing3"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      
                    <xsd:import namespace="urn:listing3"/>
                
                

				 
				 
				 
				 
				 
				 
				
                    <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
                
      <xsd:complexType name="Address">
        <xsd:sequence>
          <xsd:element name="streetNum" type="xsd:int"/>
          <xsd:element name="streetName" type="xsd:string"/>
          <xsd:element name="city" type="xsd:string"/>
          <xsd:element name="state" type="xsd:string"/>
          <xsd:element name="phone" type="listing3:Phone"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="GetAddressRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetAddressResponse">
    <wsdl:part name="address" type="tns:Address"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneResponse">
    <wsdl:part name="phone" type="listing3:Phone"/>
  </wsdl:message>
  <wsdl:portType name="AddressBook">
    <wsdl:operation name="getAddress">
      <wsdl:input message="tns:GetAddressRequest"/>
      <wsdl:output message="tns:GetAddressResponse"/>
    </wsdl:operation>
    <wsdl:operation name="getPhone">
      <wsdl:input message="tns:GetPhoneRequest"/>
      <wsdl:output message="tns:GetPhoneResponse"/>
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

 

从清单 1 的范例中显而易见导入的主要目的是为了导入命名空间。XSD 导入的一个更常见的用途是导入另一个文件中的命名空间。您可以聚集文件中的命名空间,但是请不要忘记那是您导入的命名空间,而不是文件(不要将 import 语句和 include 语句混淆)。

当您从一个文件导入命名空间时,将看见 XSD 导入语句中的 schemaLocation 属性,但这是一个可选属性。如您在清单 1 中所见, schemaLocation 不是必需的,因为 import 语句的命名空间如 import 语句本身一样,位于同一个位置(在同一个文件中)。实际上,即使您提供了文件位置(如清单 2 所示),XML 解析器也能够忽略该位置(如果 XML 解析器想这样做的话)。 schemaLocation 属性只不过是一个提示(hint)。如果解析器已经知道命名空间中的模式类型,或者有其他寻找这些模式类型的方法,它就不需要定位到你所提供的位置。它的这个特性也从另一方面提示您 XSD import 语句的主要目的是导入命名空间,而不是告诉您在命名空间的何处可以找到这些声明。当然,大多数时候 XML 解析器并不了解您将要导入的命名空间,所以有必要指定 schemaLocation 属性,并且很容易忘记该属性其实仅仅是一个提示。

现在,查看清单 1中用蓝色突出显示的 import 语句。由于使用了 XSD 命名空间,因此应该实际导入该命名空间。但是这是一个十分常见的命名空间。事实上每个 XML 解析器都知道它。大多数解析器允许为其包含 import 语句。其实很多工具甚至允许您忽略红色部分的 import 语句 -- 导入的存在于相同文件中的名字空间。但是导入所有要使用的命名空间是一个好习惯,您应该养成这样的习惯。因为您不知道什么时候或是某个使用您的 WSDL 文件的人可能将使用更严格的工具。

必须确保您在 import 语句中使用的命名空间与您所导入模式的 targetNamespace 相同。在清单 1 的范例中,显然您必须这样做。但是如果您将 urn:listing3 模式移动到一个名为 listing3.xml的文件中,并导入该文件(如清单 2所示),那么这两者的相同可能就不那么明显了。实际上,这可能看起来好像您能够通过使用 import 语句中(而不是 targetNamespace 中)的不同命名空间属性在文件中修改模式的命名空间。这是一个错误。您不能修改命名空间。Import 语句的命名空间属性必须与该模式的 targetNamespace 一致。

清单23源于清单 1。清单 2 是清单 1 将 Phone 模式移到清单 3 中的文件之后的结果。清单 2 中的 import 语句现在包含了 schemaLocation 属性(用蓝色突出显示)。这是从文件导入模式的推荐方法。


清单 2. 导入 Phone 模式 XSD 文件的地址簿 WSDL

<?xml version="1.0" ?>
<wsdl:definitions targetNamespace="urn:listing2"
                  xmlns:tns="urn:listing2"
                  xmlns:listing3="urn:listing3"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <xsd:schema targetNamespace="urn:listing2"
                xmlns:listing3="urn:listing3"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="urn:listing3" 
                    schemaLocation="listing3.xsd"
                />
      <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
      <xsd:complexType name="Address">
        <xsd:sequence>
          <xsd:element name="streetNum" type="xsd:int"/>
          <xsd:element name="streetName" type="xsd:string"/>
          <xsd:element name="city" type="xsd:string"/>
          <xsd:element name="state" type="xsd:string"/>
          <xsd:element name="phone" type="listing3:Phone"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="GetAddressRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetAddressResponse">
    <wsdl:part name="address" type="tns:Address"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneResponse">
    <wsdl:part name="phone" type="listing3:Phone"/>
  </wsdl:message>
  <wsdl:portType name="AddressBook">
    <wsdl:operation name="getAddress">
      <wsdl:input message="tns:GetAddressRequest"/>
      <wsdl:output message="tns:GetAddressResponse"/>
    </wsdl:operation>
    <wsdl:operation name="getPhone">
      <wsdl:input message="tns:GetPhoneRequest"/>
      <wsdl:output message="tns:GetPhoneResponse"/>
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>



清单 3. Phone 模式的 XSD 文件

<?xml version="1.0" ?>
<xsd:schema targetNamespace="urn:listing3"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
  <xsd:complexType name="Phone">
    <xsd:sequence>
      <xsd:element name="areaCode" type="xsd:int"/>
      <xsd:element name="exchange" type="xsd:int"/>
      <xsd:element name="number" type="xsd:int"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

 


WSDL 导入

查看清单45。它们基本上与清单 2 和 3 相同。清单 4 导入清单 5,这与清单 2 导入清单 3 类似。但是这一次使用 WSDL 导入而不是 XSD 导入。清单 2 与清单 4 之间的差别在清单 4 中用蓝色突出显示。同样,清单 3 与清单 5 之间的差别在清单 5 中用蓝色突出显示。


清单 4. 导入 Phone 模式 WSDL 文件的地址簿 WSDL

<?xml version="1.0" ?>
<wsdl:definitions targetNamespace="urn:listing4"
                  xmlns:tns="urn:listing4"
                  xmlns:listing5="urn:listing5"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  
                    <wsdl:import namespace="urn:listing5" location="listing5.wsdl"/>

                
  <wsdl:types>
    <xsd:schema targetNamespace="urn:listing4"
                xmlns:listing5="urn:listing5"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
      <xsd:complexType name="Address">
        <xsd:sequence>
          <xsd:element name="streetNum" type="xsd:int"/>
          <xsd:element name="streetName" type="xsd:string"/>
          <xsd:element name="city" type="xsd:string"/>
          <xsd:element name="state" type="xsd:string"/>
          <xsd:element name="phone" 
                    type="listing5:Phone"

                />
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="GetAddressRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetAddressResponse">
    <wsdl:part name="address" type="tns:Address"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="GetPhoneResponse">
    <wsdl:part name="phone" 
                    type="listing5:Phone"
                />
  </wsdl:message>
  <wsdl:portType name="AddressBook">
    <wsdl:operation name="getAddress">
      <wsdl:input message="tns:GetAddressRequest"/>
      <wsdl:output message="tns:GetAddressResponse"/>
    </wsdl:operation>
    <wsdl:operation name="getPhone">
      <wsdl:input message="tns:GetPhoneRequest"/>
      <wsdl:output message="tns:GetPhoneResponse"/>
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>



清单 5. Phone 模式的 WSDL 文件

<?xml version="1.0" ?>

                    <wsdl:definitions targetNamespace="urn:listing5"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>

                
    <xsd:schema targetNamespace="urn:listing5"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
      <xsd:complexType name="Phone">
        <xsd:sequence>
          <xsd:element name="areaCode" type="xsd:int"/>
          <xsd:element name="exchange" type="xsd:int"/>
          <xsd:element name="number" type="xsd:int"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  
                    </wsdl:types>
</wsdl:definitions>
                
            

 

这样做很好吗?如果您在 listing4.wsdl 上运行 WSDL-to-Java 工具,将会发生错误。在清单 4 中,突出显示了两个对 Phone 类型的引用,一个是绿色的,另一个是红色的。绿色的引用在 WSDL 消息语句中。该语句能够查找到 Phone ,因为它是一个 WSDL 语句,并且 WSDL 文件是通过 WSDL import 语句导入 Phone 的。红色的引用在模式中。该引用不能查找到 Phone ,因为它不是通过 XSD import 语句来导入的。您不能在模式之外执行对其他模式的查找。而是必须从模式内导入其他模式。

如果 Address 类型没有 phone 元素并且因此没有引用 urn:listing5 命名空间,那么清单 4 和 5 将是合法的。然而,对于用 WSDL 导入方法来导入模式信息而言,这不是一个好方法。清单 2 和 3 比清单 4 和 5 更佳。使用 XSD 导入 来导入模式,使用 WSDL 导入来导入 WSDL。

作为 WSDL 导入范例,您会注意到清单 4 中既没有绑定语句,也没有服务语句。估计可能一些其他包含绑定和服务的文件将通过 WSDL import 语句来导入 listing4.wsdl。

关于 WSDL 导入的最后两个注释。与 XSD 导入类似,WSDL 导入的 namespace 属性必须和所导入 WSDL 的 targetNamespace 相同。WSDL 导入的 location 属性与 XSD 导入的 schemaLocation 属性相似,只不过是一个提示。然而,与 XSD 导入的 schemaLocation 属性不同的是,WSDL 导入的 location 属性是必须给出的。(这在 WSDL 1.1 规范中没有明确提出,但在 WS-I Web 站点的基本概要(Basic Profile)中阐明了这一点。(请参阅参考资料。) )


结束语

简单的说,本技巧要说明的是:

  • 使用 XSD 导入来导入模式,使用 WSDL 导入来导入 WSDL,这是一个很好的惯例。
  • 导入所有要使用的命名空间,这是一个好习惯。
  • 导入命名空间的属性值必须与导入的 targetNamespace 值一致。
  • Import 语句的主要目的是导入命名空间。 schemaLocationlocation 属性尽管有时是必需的,但其实只不过是一个提示。
<!-- CMA ID: 21482 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

 

参考资料

分享到:
评论

相关推荐

    Scrapy-1.8.2.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    search-log.zip

    搜索记录,包括时间、搜索关键词等,用于PySpark案例练习

    6-12.py

    6-12

    2-6.py

    2-6

    Scrapy-0.24.5-py2-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于CS的远程监控系统软件项目(免费提供全套java开源项目源码+论文)

    项目介绍 背景 在当今的数字化时代,远程监控系统已经成为企业和个人必不可少的工具。随着物联网(IoT)技术的发展,监控系统的需求不断增加,不仅仅局限于视频监控,还包括数据监控、设备状态监控等。基于CS(Client-Server)架构的远程监控系统应运而生,旨在提供高效、实时、可靠的监控服务,帮助用户实现远程管理和控制。 目的 基于CS的远程监控系统软件项目旨在为用户提供一个综合性的监控平台,通过该平台,用户可以实时监控各类设备和数据,实现远程控制和管理,提高工作效率,降低运营成本。同时,该系统还可以用于安全防护、生产过程监控等多种场景,具有广泛的应用前景。 模块说明 前端模块 前端模块是用户与系统交互的界面,负责展示监控数据和接收用户指令。前端模块的主要功能包括: 用户登录与认证:通过安全的登录机制,确保只有授权用户才能访问系统。 实时数据展示:以图表、仪表盘等形式展示实时监控数据,包括视频流、传感器数据等。 报警通知:当监控系统检测到异常情况时,前端模块会通过弹窗、声音等方式通知用户。 远程控制:用户可以通过前端界面对设备进行远程控制,例如开关设备、调整参数等。

    课程大作业二手车价格预测案例数据挖掘python源码+数据集+实验报告+详细注释.zip

    课程大作业二手车价格预测案例数据挖掘python源码+数据集+实验报告+详细注释.zip

    基于springcloud和vue后台管理系统.zip

    springcloud 基于springcloud和vue后台管理系统.zip

    基于Pyotrch的深度学习物体分类可视化系统源码+预训练模型+详细训练教程.zip

    基于Pyotrch的深度学习物体分类可视化系统源码+预训练模型+详细训练教程.zip

    pytest-3.0.2.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    XXX公司组织结构诊断报告.ppt

    XXX公司组织结构诊断报告.ppt

    3-18-1.py

    3-18-1

    ZCU102 FPGA DDR4 MIG IP核读写接口封装与FIFO测试工程教程(配套下载资料)

    本资源提供了一份全面的教程,专注于使用ZCU102 FPGA开发板实现DDR4内存的读写操作。通过构建DDR4的MIG(Memory Interface Generator)IP核,本教程详细介绍了如何封装DDR4的读写时序,并创建了一个类似FIFO(先进先出)的接口,以优化数据流的管理和控制。此外,还包含了对所封装接口进行测试的工程实例,帮助开发者深入理解DDR4内存接口的高效应用。适合希望在FPGA项目中集成高效内存管理方案的工程师和高级学者。

    课程设计基于matlab机械臂末端轨迹规划的源码.zip

    课程设计基于matlab机械臂末端轨迹规划的源码.zip

    基于深度学习的LSTM算法双色球预测实战完整代码.zip

    基于深度学习的LSTM算法双色球预测实战完整代码.zip

    yolov5-face-landmarks-opencv

    yolov5检测人脸和关键点,只依赖opencv库就可以运行,程序包含C++和Python两个版本的。 本套程序根据https://github.com/deepcam-cn/yolov5-face 里提供的训练模型.pt文件。转换成onnx文件, 然后使用opencv读取onnx文件做前向推理,onnx文件从百度云盘下载,下载 链接:https://pan.baidu.com/s/14qvEOB90CcVJwVC5jNcu3A 提取码:duwc 下载完成后,onnx文件存放目录里,C++版本的主程序是main_yolo.cpp,Python版本的主程序是main.py 。此外,还有一个main_export_onnx.py文件,它是读取pytorch训练模型.pt文件生成onnx文件的。 如果你想重新生成onnx文件,不能直接在该目录下运行的,你需要把文件拷贝到https://github.com/deepcam-cn/yolov5-face 的主目录里运行,就可以生成onnx文件。

    matlab基于Matlab_Simulink的自主水下航行器三维路径跟踪仿真.zip

    matlab基于Matlab_Simulink的自主水下航行器三维路径跟踪仿真.zip

    麦肯锡 - 上海xx集团-完善组织架构,优化管理流程.ppt

    麦肯锡 - 上海xx集团-完善组织架构,优化管理流程.ppt

    pytest-7.3.2.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    matlab将MATLAB连接到OpenAI聊天完成API(支持ChatGPT).zip

    matlab将MATLAB连接到OpenAI聊天完成API(支持ChatGPT).zip

Global site tag (gtag.js) - Google Analytics