XML

wiki

很好的xml讲解

完整理解XML

XML is incredibly diverse and includes a host of othertechnologies including XPointerXLink, and Resource Description Framework (RDF).

 we are defining Web Services to be built onXML, SOAP, WSDL, and UDDI over a transport protocol such as HTTP. Thisdefinition will become clearer as our discussions progress

XML Parsers

Processing an XML document requires the use of an XML parser, a program that can decompose the XML document into its individual elements. There are two major categories of XML parsers:Document Object Model (DOM) and Simple API for XML (SAX).

DOM解析主要有两个缺点: 

1:xml需要全部一次性加载到内存中,如果xml足够大,将导致很大的性能开销,性能会很低。

2:因为xml是跨语言独立的,应用非常普遍,因此许多常用的编程语言需要更多的步骤去处理xml,因为不是语言特定的。例如java采用 JDOM解析。

SAX解析:

sax解析是基于事件的解析,sax解析依赖于事件注册,每一个事件句柄是一个处理特定任务的代码块,SAX解析的主要优点就是不需要一次性的把xml的dom文档加载到内存中。 调用事件句柄xml作为一种数据流处理,sax解析比dom更容易工作。

也有两个缺点

1:一旦xml被读后,内存中就不在有xml的内容了,如果需要额外的处理需要再进行解析。

2:SAX解析不能修改xml文档的内容。

XML需要特定的格式:所以 一个格式良好的xml才能进行解析,否则DOM和SAX拒绝解析格式不完整的xml:

怎样才能保证xml格式正确呢! 

DTDs and Schemas是两个约束xml的定义。

xml参考DTD声明,通过DTD验证xml的格式是否正确,DTD能够定义元素的顺序,以及元素出现的次数等等。 wiki
DTD也有以下缺点: 
    1:DTD 在出现时间上优先于xml,不符合xml的语法,增加了学习的负担(相对于schema),造成很多的疑惑。
    2:DTD不支持数据类型,不能定义元素的数据类型,没有办法定义一个标示integer的类型。  
   3:xml只能引用一个DTD,限制了多个验证的出现。
    4:DTD无法定义一个日期格式。
   5:DTD不支持命名空间,将导致很多的元素命名冲突。
以上已经有很多限制了,因此SOAP,web services的基石,不允许使用DTD在文档声明中。
因此: XML schema specifications     就出现了。
      schema有以下优势:
      1:支持命名空间。
      2:包括了很多预定义的类型设置:string,integer,positive integer,nagative integer,date, time,和以其他一些数据类型。
      3:xml也能创建新的的类型,根据特定的规则。

XML Namespaces

An enterprise system consists of dozens if not hundreds of XML documents. As these XML documents are merged from other sources, inevitably there will be duplicate element names. This can cause problems because each element must have a unique name. XML resolves this name collision issue through the use of namespaces (Java provides a similar feature through packages). Each element is prefixed with a namespace and therefore has to be unique only for that given namespace rather than globally. In practice, the prefix is usually the name of the company, although any Uniform Resource Locator (URL) will do.2 Thus, an element name is composed of two parts: the namespace and the name of the element. By qualifying the name of each element with a qualifier, the likelihood of a name collision is greatly reduced. Consider the file system, for example. For a given directory, a filename must be unique. However, there can be multiple identical filenames as long as each exists in a different directory. In a sense, the directory provides the namespace and qualifies the filename to resolve filename conflicts.

以上是对xml命名空间的解释,简单的来说就是防止元素命名冲突,就想java的 包名,防止类名冲突一样。

Service-Oriented Access Protocol (SOAP)

在讨论soap的特点之前,解释一下soap为什么这么流行。
1:soap是一种非常轻量级的协议,一些早期的计算协议( CORBA, RMI, DCOM, etc.)包含非常先进的特性, such as registering and locating objects
在核心上,soap定义了如何连接系统,通过其他的技术: provide registration features (UDDI) and location features (WSDL).
2:soap是一种操作系统独立的语言,soap不像别的中间件技术, (such as RMI, which works only with Java, and DCOM, which works only on Microsoft Windows and NT).
3:soap是基于xml的,代替了相应的二进制的协议,(as is the case with CORBA and DCOM),soap是基于xml的,是一个普遍的标准,xml是非常易读的。
4:soap能够用在多个传输协议上,包括:HTTP, Simple Mail Transfer Protocol (SMTP), file transfer protocol (FTP), and Java Message Service (JMS),很多例子讲解了http的soap协议。
5:soap能够穿越防火墙,soap不需要额外的修改,相比较CORBA- or DCOM-based systems, 需要在防火墙上打开一个端口,这是一个重要的因素,构建的配置系统和外部的系统交互穿越防火墙。在以后,这也是一个缺点。
6:soap被很多供应商支持, IBM, Microsoft, BEA, and Apache provide support for SOAP in the form of SOAP toolkits (the IBM and Apache SOAP toolkits are two of the most popular).
7:soap是可扩展的,header的值,在xml文档中,能够提供额外的特征, authentication, versioning, and optimization. 等。
soap的缺点:
1:soap工具包中的互通性,供应商需要解决这个问题。
2:soap缺少一些先进的特性,比如: guaranteed messaging and security policies
Many of these issues can be addressed through third-party technologies such as Web Services networks, which are discussed in further detail in later chapters
soap 建立了一种信息概念,传递xml文档从一个发送人到一个接受者,因为soapxml变得更加著名,soap有三部分组成 Envelope, Header, and Body.
XML_第1张图片
上图为The structure of a SOAP document. soap的文档结构。
soap标准定义了三个主要参数:
Envelope body structure.
envelope 包含了一下信息:方法调用,可选参数,返回值,以及有时候执行不成功的可选的异常。
Data encoding rules.由于soap必须支持多种语言和操作系统,它必须为不同的数据类型(float,integer ,arrays,etc)定义可以接受的表示方法,更复杂的类型,需要一些常用的编码工具包的。
Usage conventions.soap能够用于多种方式,它们所有的方式都基本做相同的相应,发件人发送一个xml文档,接受者接受,可选择的返回一个xml形式的响应,这是一种双向的信息交换方式,xml可能包含错误,如果在处理过程中出现错误。
soap允许接受者链在一起,基于soap的架构能够变得复杂,下图显示了五个常用的架构在基于soap的系统中,Fire and Forget(发后不理), Request Response(请求响应), Notification(通知), Broadcast(广播), and Workflow/Orchestration(工作流)。

从图中可以看出,一些处理链中不是终端,而是一个中间引用,soap标准允许中间引用修改soap的部分信息再传递到下一个终端前。

Migrating from XML to SOAP(转化xml到soap)

转化xml到soap是一个很简单的过程,转化包括以下步骤:
1:增加可选header 参数。
2:把xml的body添加到soap的body中,
3:声明合适的命名空间。
4:增加可选的异常处理,
5:选择传输的协议。(FTP,SMTP,HTTP)
例如:以下是一个xml格式的。
<?xml version="1.0" encoding="UTF-8"?>
<Order>
        <Customer>
            <name>John Doe</name>
            <street>1111 AnyStreet</street>
            <city>AnyTown</city>
            <state>GA</state>
            <zip>10000</zip>
            /Customer>
</Order>

转化为soap后为(为了更加直观,http片段被省去)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
        xmnls:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"
        xmnls:xsi="http://www.w3.org/1999/XMLSchema-instance"
        xmnls:xsi="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
        . . . [optional header information]
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<Order>
    <Customer>
        <name>John Doe</name>
        <street>1111 AnyStreet<street>
        <city>AnyTown</city>
        <state>GA<state>
        <zip>10000</zip>
    </Customer>
</Order>
<SOAP-ENV:Body>
<SOAP-ENV:Envelope>

SOAP Envelope


The SOAP envelope是一个容器存储其他其他元素的soap信息。
服务器端通过soap处理器通过http://schemas.xmlsoap.org/soap/envelope/ namespace declaration 命名空间声明来判定传入的xml是否是一个soap信息格式。
这个处理是一个应用服务器的一部分,它也许是一个外部的产品 ,比如: Cape Clear CapeConnect

SOAP Header

header是可扩展设计的一部分,允许符合soap标准的信息扩展,header是envelope的子元素,每一个header元素有它自己的子节点。
下面是两个可扩展的例子:
1:embedding authentication information 嵌入一个认证信息。
2:specifying an account number for use with a pay-per-use SOAP service 定义付费试用soap服务的次数。
soap传输的中间件能够进行合适的认证,在传入下一个中间件或者终端之前。

Exception Handling

异常处理,在这种情况下soap处理器不能够解析一段信息,一个soap错误就产生了。定义在 Fault  元素中,它的子元素是faultcode,定义了发生错误的种类,SOAP 1.1 defines four values for the faultcode element:
1:VersionMismatch 版本不匹配, 接受者在soap的 envelope中发现一个无效的soap命名空间。
2:MustUnderstand. 接受者遇到了一个header 元素的命令,它不能够进行解析的,注意 header的子元素是可选的。
3:Client. 错误产生在被接受的客户端,有可能引起的原因是丢失元素,元素不完整等。
4:Server. 错误发生在接收端,例如:服务器错误。
注意应用可以扩展这些值通过(.),例如一个Client.Login 能够被使用定义一个客户端登陆的错误。
除了faultcode元素,有另外两个别的元素能够描述更详细的错误:
1:faultstring 这个元素提供了为什么发生这个错误的可读性解释;
XML_第2张图片
2:detail. 当处理body元素时发生错误通过detail元素能够显示,If the detail element is not present, then the fault occurred outside of the body of the message.
如果没有 detail元素,错误信息就出现在 body元素的 外部。

Adding SOAP Support


soap的优点就是能够构建在已经存在的技术之上, 下图是一个 Typical J2EE deployment.

常用的soap处理器包括:CapeConnect from Cape Clear, Iona's XMLBus (see Appendix D for a more detailed discussion), and Apache Axis. 总之:
一个系统能够成为应用soap,包括:能够接受一个soap请求,然后转向合适的终端,打包soap响应的返回信息。
下图解释了一个J2EE environment 的 soap处理:Adding SOAP support to J2EE environment.
XML_第3张图片
虽然soap 提供了许多有用的特性,但是它也是不完美的,因为它不能够定位以下问题,
1:how does an endpoint unambiguously describe its services
2: how does a requester locate the endpoint
这些特性需要另外两个技术:WSDL and UDDI

Web Services Definition Language (WSDL) WSDL-wiki


为了让一个客户端能够有效使用 Web Service,首先需要一个描述Web Service的机制,咋一看有点困难,我们可以提供一个描述性格式信息,比如: (such as a README file),但是 Web Service 中所有的格式描述都通过这种形式有点不现实。常规的解决方法是通过一个语法树描述一个语言的语法,但是如果没有一个很强的编译北京的人很难读懂这些语法树。
WSDL能够描述web services的各种各样的特点。
WSDL是一个格式良好的xml文档,能够列出web services 的很多特性。
Publicly accessible functions.5 WSDL列出了所有的客户端希望web services可能的操作。
1: 输入输出参数关联着与之相对应的类型,为了调用每一个操作,客户端需要知道每一个预期的输入输出参数。这是一个标准的函数声明,为了支持语言和操作系统之间的可移植性,所有的数据类型是被定义为xml标准格式(schema format)
2:为每一个web 服务,绑定地址信息,为了能够在请求和服务器之间松耦合, WSDL定义了服务怎样才能被找到,(usually a URL),哪种传输协议应该被使在调用服务的过程中, (remember that a Web Service can be used with multiple protocols)(FTP,STMP,HTTP)
本质上 WSDL只是定义了一个契约--提供者承诺支持,相当于定义了一个接口,WSDL不定义每一个web services是怎么样实现的,对于这一点一个很好的比较就是CORBA's IDL
ost of the existing toolkits (GLUE, IBM Web Services Toolkit [WSTK], BEA Web Services Workshop, Cape Clear CapeStudio, etc.) have built-in functionality to automatically parse and generate WSDL files (although, due to the immaturity of the tools, the generated files still require some manual tweaking). Even so, it is still worthwhile to understand the structure of a WSDL document. 这是一些实现。

WSDL Syntax


WSDL标准列出了六个主要的元素。
1: definitions  元素是这个根元素包括其他五个元素,它定义了服务名,声明了命名空间。
2:message 元素 代表了单独的一块活动的数据在请求和响应中,它声明了0个或者更多的信息元素,每一个代表或者一个单独的参数(if this is a request) ,或者是一个单独的返回值(if it is a response).如果这一部分没有,那么请求就是无参或者没有返回值。这依据于 一个具体的请求或者相应。
注意每一个信息元素只是声明了信息在名字,值是在元素里面,在值的外面还包括一种就是值的类型 <address><string>beijing</string></address>我想应该是这样一种格式。定义输出还是输入信息是下一个元素应该具有的。
3:portType  元素申明了一个或者更多的操作集合,每一个有一个操作元素,每一个操作元素包括了名值对,定义了信息是输入还是输出,如果一个操作代表了请求和响应的交互,这个操作将包括两个信息,如果一个操作仅仅包括一个请求没有响应,或者一个响应没有请求, (e.g., an automatic notification from the provider with no request from the requester)通知就是没有请求直接响应。它将包括一个单独的信息,在java中,portType 最好想象作为一个接口,一个操作最好能够想象为一个单独的方法声明,一个信息是被想象为一个特定的操作,如果操作是输入就好比是一个方法的输入参数,如果是输出就比作方法的返回值关联着类型的。
4:types 元素被用于声明所有的类型,在请求和响应中的所有的WSDL服务声明。
5:binding 元素代表了一个特定的portType 实现,使用一个特定的协议,例如: soap,如果一个服务支持更多的协议, (SOAP, CORBA, etc.), WSDL包括了所有的这些。
6:service 元素代表了一个端口(这里的端口就是指特定的URL)的集合,The service element represents a collection of port elements, each of which represents the availability of a particular binding at a specified endpoint, usually specified as a URL where the service can be invoked.

Invoking Existing Web Services: A Sample

To invoke a Web Service, we can either write a SOAP client or use an existing generic one. Thewww.soapclient.com site provides a Web interface that allows us to enter the WSDL file and invoke the service. Before we can launch the service, we need to find the WSDL file. In this case, we can find some sample WSDL files at www.xmethods.net, a public repository of Web Services. For our example, we will invoke a Web Service that can print the traffic conditions of a specified California highway. Use the following instructions:

  • Visit the www.soapclient.com/soaptest.html site.

  • Type www.xmethods.net/sd/2001/CATrafficService.wsdl in the WSDL address field.

  • Select HTML instead of XML for the output.

  • Click Retrieve, which loads the WSDL file from across the Internet.

  • In the textfield, type 101 (for Highway 101) and click Invoke to invoke the service.

  • The resulting screen should print text that explains the current conditions for Highway 101.

This example illustrates how straightforward it is to invoke a Web Service from a browser. The user, in most cases, will not even be aware that Web Services are being used to return the values. Of course, the user can just as easily be a program, in which case the program would programmatically pass the appropriate parameters.

以上例子可以使用

XML_第4张图片

XML_第5张图片

    
    
    
    
以上是运动员的soap形式。


 


你可能感兴趣的:(XML)