Você está na página 1de 25

Descrevendo um Web Service WSDL

Mauricio Reckziegel Depois de estudarmos o protocolo de transporte SOAP, aprenda agora como descrever um Web Services. WSDL Service Web Definition anguage define um sistema para a descri!"o de servi!os. Atrav#s dela, descrevemos os servi!os e$ternos, ou interfaces %ue s"o oferecidos por uma determinada aplica!"o, independente de sua plataforma ou linguagem de programa!"o. A especifica!"o da linguagem, em &M , descreve a estrutura da &M %ue cada documento WSD deve obedecer '(ttp)**+++.+,.org*&M *Sc(ema*-. A WSD se encontra atualmente na vers"o ../, disponibilizada no +eb site (ttp)**+++.+,.org*0R*+sdl./*. Submetida a W,1, foi definida em esfor!o con2unto entre Microsoft, 34M e Ariba. O seu principal ob2etivo # descrever as interfaces apresentadas e apontar a localiza!"o dos seus servi!os, dispon5veis em um local previs5vel e bem con(ecido, na rede, o %ual permite %ue o cliente acesse de maneira confi6vel. Por ser um documento &M , sua leitura se torna f6cil e acess5vel. Componentes Atrav#s dos componentes, # poss5vel uma maior fle$ibilidade dos WSD , estes podem ser reutilizados para definir diferentes servi!os. Os componentes s"o) . 0ipos de dados) Denominados de tipos 7t8pes9. . Par:metros de entrada e sa5da de um servi!o) Denominados de mensagem 7message9. . O relacionamento entre par:metros de entrada e sa5da) Assinatura do m#todo, denominada de operaes 7operation9. . Agrupamento l;gico de opera!<es) Denominado de tipo de porta 7port08pe9. . O protocolo a ser usado para acessar os m#todos de um ob2eto) Denominado de vnculo, define o protocolo a ser usado para acessar os m#todos de um ob2eto 'SOAP, =00P ou M3M>-. . >ndere!o do servi!o. Al#m dos componentes acima, define um servi!o. O diagrama a seguir mostra os principais elementos da WDS %ue podem ocorrer e um documento.

?igura @. Principais elementos de um WSD . Namespaces Os namespaces s"o espa!os para nomes, definidos no interior dos documentos &M . Am documento WSD # um &M , %ue utiliza os namespaces para ma$imizar a ta$a de reutiliza!"o dos componentes de um documento WSD , utilizandoBse de atributos para fazer referCncia a outros elementos, se2a dentro ou fora do documento. Abai$o uma tabela com os principais namespaces de um documento WSD ) Prefixo WSD !" do namespace (ttp)**sc(emas.$mlsoap.org*+sdl Descri#o Damespace de WSD para frame+ork WSD Damespace de WSD para vinculo de SOAP e WSDl Damespace de WSD para WSD (ttp E>0 F vinculo POS0

SOAP

(ttp)**sc(emas.$mlsoap.org*+sdl*soap

=00P

(ttp)**sc(emas.$mlsoap.org*+sdl*(ttp

Mime

(ttp)**sc(emas.$mlsoap.org*+sdl*mime

Damespace de WSD para vinculo M3M> de WSD Damespace de codifica!"o conforme definido pelo SOAP @.@ Damespace de codifica!"o conforme definido pelo SOAP @.@ Damespace da inst:ncia conforme definido pelo es%uema de &M Damespace do es%uema conforme definido pelo es%uema de &M

Soapenc (ttp)**sc(emas.$mlsoap.org*soap*encoding

Soapenv (ttp)**sc(emas.$mlsoap.org*soap*envelope

&si

(ttp)**+++.+,.org*.//@*&M Sc(emaBinstance

$sd

(ttp)**+++.+,.org*.//@*&M S(ema

$lemento %definitions& G o elemento raiz de %ual%uer documento WSD . >le cont#m atributos %ue servem para definir os namespaces utilizados no documento WSD . $lemento %t'pes& O elemento t8pes cont#m os tipos de dados %ue est"o presentes na mensagem. >$emplo) 7+sdl)part nameHIenderecoI t8peHI$sd)stringI *9 7+sdl)part nameHInumeroI t8peHI$sd)intI *9

$lemento %message& O elemento message define os dados a serem transmitidos. 1ada elemento message recebe um ou mais elementos 7part9, %ue formam as partes reais da mensagem. O elemento 7part9 define o conteJdo da mensagem representando os par:metros %ue s"o passados e a resposta %ue o servi!o retorna. 7+sdl)message nameHIget1idadeI9 7+sdl)part nameHIcidadeI t8peHI$sd)stringI *9

7*+sdl)message9 7+sdl)message nameHIget1idadeResponseI9 7+sdl)part nameHIget1idadeReturnI t8peHI$sd)stringI *9 7*+sdl)message9

$lemento %import& O elemento import funciona como separa!"o entre as v6rias partes de uma defini!"o WSD . >le possui dois atributos, os %uais definem a localiza!"o do documento importado e o seu namespace. 7import namespasceHI(ttp)**+++.cidade.com*definitions*1idadeRemote3nterfaceI locationHI(ttp)**local(ost*esdl*1idadeBinterface.+sdl*I *9 1ertifi%ueBse sempre %ue o atributo location aponte para o ar%uivo correto. $lementos %operation& e %port('pe& Os elementos port08pe possuem um con2unto de opera!<es '7operation9-, as %uais possuem um atributo name e um atributo opcional para especificar a ordem dos par:metros usados nas opera!<es. >$istem %uatro diferentes tipos de mensagens de opera!<es, segundo) . Opera!"o unidirecional) Define uma mensagem enviada de um cliente para um servi!o, sem resposta. . Solicita!"oBResposta) O mais utilizado. O cliente envia uma solicita!"o a um servi!o, e recebe como resultado uma mensagem de resposta com o resultado dessa solicita!"o. Pode ser vista como um RP1 'remote procedure call-. . PedidoBResposta) D"o utilizada fre%Kentemente. Define uma mensagem enviada do servi!o para o cliente, resultando em uma mensagem enviada do cliente de volta para o servi!o. . Dotifica!"o) G %uando o servi!o envia uma mensagem para o cliente. 1omo vocC pode ver, o portType corresponde apenas a um agrupamento de opera!<es, onde vocC pode agrup6Blas em um ou v6rios elementos 7port08pe9. 1aso vocC utilize uma ferramenta para se criar a WSD , como por e$emplo o A$is em Lava ou o nuSOAP no P=P, estas ferramentas poder"o tomar esta decis"o. $lemento %binding& O elemento binding mapeia os elementos operation em um elemento portType, para um protocolo especifico. >le associa o elemento port08pe ao protocolo SOAP, utilizandoB

se de um elemento de e$tens"o SOAP c(amado 7+sdlsoap)binding9, atrav#s de dois par:mentos) protocolo de transporte e o estilo da re%uisi!"o 'rpc ou document-. 7+sdl)binding nameHI1idadeSoap4indingI t8peHIimpl)1idadeI9 7+sdlsoap)binding st8leHIrpcI transportH(ttp)**sc(emas.$mlsoap.org*soap*(ttp *9

$lementos %service& e %port& Os elementos service e port definem a localiza!"o real do servi!o, tendo em vista %ue o mesmo pode conter varias portas e cada uma delas # especifica para um tipo de liga!"o, descrita no elemento binding. 7+sdl)service nameHI1onsulta1idadeServiceI9 7+sdl)port bindingHIimpl)1onsulta1idadeSoap4indingI nameHI1onsulta1idadeI9 7+sdlsoap)address locationH(ttp)**local(ost*+sdl*1onsulta1idadeServer.p(p*9 7*+sdl)port9 7*+sdl)service9

$xemplo de WSDL 7M$ml versionHN@./N encodingHN3SOBOOPQB@N M9 7definitions $mlns)SOAPB >DRHN)ttp*++sc)emas.xmlsoap.org+soap+envelope+N $mlns)$sdHN)ttp*++,,,.,-.org+.//0+12LSc)emaN $mlns)$siHN)ttp*++,,,.,-.org+.//0+12LSc)ema3instanceN $mlns)SOAPB>D1HN)ttp*++sc)emas.xmlsoap.org+soap+encoding+N $mlns)tnsHNurn*server.)elloN $mlns)soapHN)ttp*++sc)emas.xmlsoap.org+,sdl+soap+N $mlns)+sdlHN)ttp*++sc)emas.xmlsoap.org+,sdl+N $mlnsHN)ttp*++sc)emas.xmlsoap.org+,sdl+N targetDamespaceHNurn*server.)elloN9 7t8pes9 7$sd)sc(ema targetDamespaceHNurn*server.)elloN9 7$sd)import namespaceHN)ttp*++sc)emas.xmlsoap.org+soap+encoding+N *9 7$sd)import namespaceHN)ttp*++sc)emas.xmlsoap.org+,sdl+N *9 7*$sd)sc(ema9 7*t8pes9 7message nameHN)ello!e4uestN9 7part nameHNnameN t8peHNxsd*stringN *9 7*message9 7message nameHN)ello!esponseN9 7part nameHNreturnN t8peHNxsd*stringN *9 7*message9

7port08pe nameHNserver.)elloPort('peN9 7operation nameHN)elloN9 7documentation9Retorna o nome7*documentation9 7input messageHNtns*)ello!e4uestN *9 7output messageHNtns*)ello!esponseN *9 7*operation9 7*port08pe9 7binding nameHNserver.)ello5indingN t8peHNtns*server.)elloPort('peN9 7soap)binding st8leHNrpcN transportHN)ttp*++sc)emas.xmlsoap.org+soap+)ttpN *9 7operation nameHN)elloN9 7soap)operation soapActionHNurn*server.)ello6)elloN st8leHNrpcN *9 7input9 7soap)bod8 useHNencodedN namespaceHNurn*server.)elloN encodingSt8leHN)ttp*++sc)emas.xmlsoap.org+soap+encoding+N *9 7*input9 7output9 7soap)bod8 useHNencodedN namespaceHNurn*server.)elloN encodingSt8leHN)ttp*++sc)emas.xmlsoap.org+soap+encoding+N *9 7*output9 7*operation9 7*binding9 7service nameHNserver.)elloN9 7port nameHNserver.)elloPortN bindingHNtns*server.)ello5indingN9 7soap)address locationHN)ttp*++local)ost+imasters.+nuS78P+server..p)pN *9 7*port9 7*service9 7*definitions9

Protocolo de (ransporte Padr#o S78P


Mauricio Reckziegel S78P O SOAP surgiu no ano de @QQO, apresentado ao World Wide Web 1onsortium 'W,1pelas empresas DevelopMentor, Microsoft e Aser and Soft+are como um SInternet DraftI. 3nicialmente, este protocolo definia um mecanismo para transmiss"o de procedimentos remotos &M sobre =0M . Devido a divergCncias pol5ticas, sua especifica!"o em @QQO n"o ocorreu, mas sim em dezembro de @QQQ.

G um dos principais elementos dos Web Services, apesar de n"o ser necess6rio o con(ecimento do seu funcionamento para se criar e consumir um Web Service. Por#m, o entendimento geral do protocolo # Jtil para se lidar com eventuais situa!<es de erros e problemas com a interoperabilidade entre plataformas no uso de Web Services. O protocolo se encontra na vers"o @... Dividida em duas partes principais) A primeira parte da especifica!"o define um framework de mensagens. Protocolos de rede variados, como =00P, SM0P, ?0P, RM3*33OP ou um protocolo de mensagem propriet6rio servem como carregadores das mensagens SOAP. A segunda define trCs componentes opcionais) um con2unto de regras de codifica!"o para e$pressar inst:ncias dos tipos de dados definidos pela aplica!"o, uma conven!"o para representar RP1s e respostas e um con2unto de regras para usar SOAP com =00P*@.@. Segundo W,1, as duas especifica!<es se classificam da seguinte maneira) . Service Oriented Arc(itecture Protocol) no caso geral, uma mensagem SOAP representa a informa!"o necess6ria para invocar um servi!o ou analisar o resultado de uma c(amada e cont#m informa!<es espec5ficas da defini!"o da interface do servi!o. . Service Ob2ect Access Protocol) representa!"o opcional do SOAP RP1, a mensagem SOAP representa um m#todo de invoca!"o de um ob2eto remoto, e a serializa!"o da lista de argumentos do m#todo %ue precisam ser movidos do ambiente local para o ambiente remoto. >m outras palavras, SOAP possibilita dois processos 'possivelmente em duas m6%uinas diferentes- comunicarem entre si, desconsiderando o (ard+are e a plataforma %ue eles est"o rodando. D"o est6 vinculado a nen(uma plataforma de (ard+are, soft+are ou linguagem de programa!"o. G considerado superficial, pois cont#m menos recursos %ue outros protocolos de computa!"o distribu5dos. Am dos grandes benef5cios do SOAP # %ue ele # aberto e foi adotado pela maioria das grandes empresas de (ard+are e soft+are. A sua especifica!"o provC a base para a comunica!"o aplica!"oBaplica!"o) os Web Services. 1onstru5do no topo de padr<es abertos como =00P e &M , facilita o aprendizado, por parte dos desenvolvedores e o suporte das infraBestruturas. >le # um protocolo %ue define uma gram6tica &M especializada, por#m fle$5vel, %ue padroniza o formato das estruturas das mensagens. As mensagens s"o, por outro lado, o m#todo fundamental de troca de informa!<es entre os Web Services e os seus consumidores. Ao utilizar &M para codificar mensagens o SOAP nos d6 alguns benef5cios, segundo Rommel) . &M pode ser facilmente lido por usu6rios, portanto, mais f6cil de entender e eliminar erros. . &M parsers 'analistas- e tecnologias correlatas s"o mundialmente dispon5veis.

. &M # um padr"o aberto. . &M inclui v6rias tecnologias %ue podem fortalecer o SOAP. . Simplifica!"o da especifica!"o, diferente de outros protocolos bin6rios como 1OM, D1OM e 1OR4A. Principais vantagens da utiliza!"o do protocolo SOAP, em rela!"o a outros sistemas de comunica!"o, segundo Simone da Silva Amorim) . Pode atravessar firewalls com facilidade. . Os dados do SOAP s"o estruturados usando &M . Portanto, as mensagens podem ser compreendidas por %uase todas as plataformas de hardware, sistemas operacionais e linguagens de programa!"o. . Pode ser usado, potencialmente, em combina!"o com v6rios protocolos de transporte de dados, como =00P, SM0P e ?0P. . O SOAP mapeia satisfatoriamente para o padr"o de solicita!"o * resposta =00P. . Pode ser usado tanto de forma anTnima como com autentica!"o 'nome*sen(a-. Principais desvantagens* . ?alta de interoperabilidade entre ferramentas de desenvolvimento do SOAP. >mbora o SOAP ten(a amplo suporte, ainda e$istem problemas de incompatibilidades entre diferentes implementa!<es do SOAP. . Mecanismos de Seguran!a 3maturos. O SOAP n"o define mecanismo para criptografia do conteJdo de uma mensagem SOAP, o %ue evitaria %ue outros tivessem acesso ao conteJdo da mensagem. . D"o e$iste garantia %uanto U entrega da mensagem. Vuando uma mensagem estiver sendo transferida, se o sistema fal(ar, ele n"o saber6 como reenviar a mensagem. . Am cliente SOAP n"o pode enviar uma solicita!"o a v6rios servidores, sem enviar a solicita!"o a todos os servidores. O fato das aplica!<es permitirem %ue o SOAP se2a usado com o =00P permite transpor barreiras como firewalls com facilidade, permitindo %ue os soft+ares %ue aceitem SOAP este2am dispon5veis internamente e e$ternamente na rede. >sta caracter5stica pode ser vista como vantagem e tamb#m como desvantagem, 26 %ue pode causar um s#rio problema de seguran!a, onde as aplica!<es do SOAP seriam acess5veis por partes n"o autorizadas.

Resumindo, SOAP # um protocolo leve, o %ue faz ele ter poucos recursos e de f6cil entendimento. Mas, por outro lado, nos faz ter uma preocupa!"o maior com rela!"o a seguran!a e transporte das mensagens. 9uncionalidades do S78P O SOAP nos provC as seguintes funcionalidades) . 3nteroperabilidade entre sistemas utilizando linguagens e protocolos padronizados largamente difundidos, como &M e =00P. . Permite a comunica!"o entre sistemas protegidos por firewalls, sem precisar abrir portas adicionais e possivelmente n"o seguras. >le utiliza 'na maioria dos servidores- a porta O/. . SOAP descreve completamente cada elemento na mensagem, facilitando o entendimento e a prote!"o contra erros. >, algumas funcionalidades %ue o SOAP n"o # capaz de e$ecutar) . 1oleta de li$o distribu5da. . Ob2etos por ReferCncia 'pois # necess6ria a coleta de li$o distribu5da-. $strutura De acordo com o W,Sc(ools, a estrutura da mensagem SOAP # definida em um documento &M %ue cont#m os seguintes elementos) 7SOAPB>DR)envelope9 7WX >lemento raiz do SOAP e define %ue essa # uma mensagem SOAPY9 7SOAPB>DR)(eader9 7WX>specifica informa!<es especificas como autentica!"o 'opcional-Y9 7*SOAPB>DR)(eader9 7SOAPB>DR)bod89 7WXO elemento 4ODZ cont#m o corpo da mensagemY9 7SOAPB>DR)fault9 7WXO elemento ?AA 0 cont#m os erros %ue podem ocorrerY9 7*SOAPB>DR)fault9 7*SOAPB>DR)bod89 7*SOAPB>DR)envelope9 >nvelope 'obrigat;rio-) # respons6vel por definir o conteJdo da mensagem[ B encodingSt'le) atributo %ue tem como ob2etivo especificar como as informa!<es devem ser codificadas.

%S78P3$N:*$nvelope xmlns*S78P $N:;<)ttp*++sc)emas.xmlsoap.org+soap+envelope+< S78P3 $N:*encodingSt'le;<)ttp*++sc)emas.xmlsoap.org+soap+encoding+<& 7SOAPB>DR)=eader9 \ 7*SOAPB>DR)=eader9 7SOAPB>DR)4od89 \ 7*SOAPB>DR)4od89 7*SOAPB>DR)>nvelope9 =eader 'opcional-) cont#m os dados do cabe!al(o[ 7SOAPB>DR)>nvelope $mlns)SOAP >DRHI(ttp)**sc(emas.$mlsoap.org*soap*envelope*I SOAPB >DR)encodingSt8leHI(ttp)**sc(emas.$mlsoap.org*soap*encoding*I9 %S78P3$N:*=eader& %a*aut)entication xmlns*a;<)ttp*++,,,.mauriciorec>?iegel.com+soap+aut)entication<& %a*username&2auricio%+a*username& %a*pass,ord&!ec>?iegel%+a*pass,ord& %+a*aut)entication& %+S78P3$N:*=eader& 7SOAPB>DR)4od89 \ 7*SOAPB>DR)4od89 7*SOAPB>DR)>nvelope9 B actor) especifica o receptor %ue deve processar o elemento do cabe!al(o. 7SOAPB>DR)>nvelope $mlns)SOAP >DRHI(ttp)**sc(emas.$mlsoap.org*soap*envelope*I SOAPB>DR)encodingSt8leHI(ttp)**sc(emas.$mlsoap.org*soap*encoding*I9 7SOAPB>DR)=eader9 7a)aut(entication $mlns)aHI(ttp)**+++.mauricioreckziegel.com*soap*aut(enticationI S78P3 $N:*actor;<)ttp*++,,,.mauriciorec>?iegel.com+soap+aut)enticator<& 7a)username9Mauricio7*a)username9 7a)pass+ord9Reckziegel7*a)pass+ord9 7*a)aut(entication9 B mus nderstand) especifica se uma entrada de cabe!al(o # obrigat;ria ou opcional 'booleano-. 7SOAPB>DR)>nvelope $mlns)SOAP >DRHI(ttp)**sc(emas.$mlsoap.org*soap*envelope*I

SOAPB >DR)encodingSt8leHI(ttp)**sc(emas.$mlsoap.org*soap*encoding*I9 7SOAPB>DR)=eader9 7a)aut(entication $mlns)aHI(ttp)**+++.mauricioreckziegel.com*soap*aut(enticationI S78P3$N:*must ndestrand;<0<& 7a)username9Mauricio7*a)username9 7a)pass+ord9Reckziegel7*a)pass+ord9 7*a)aut(entication9 . 4od8 'obrigat;rio-) cont#m a codifica!"o atual de uma c(amada a um m#todo e todos os argumentos de entrada ou uma resposta codificada %ue cont#m o resultado de uma c(amada de um m#todo. . 9ault) cont#m as informa!<es dos erros ocorridos no envio da mensagem. Apenas nas mensagens de resposta do servidor. O envelope SOAP # a parte obrigat;ria de uma mensagem SOAP. >le funciona como um recipiente de todos os outros elementos da mensagem, possivelmente o cabe!al(o e o corpo, assim como os namespaces de cada um. Assim como o nome e o endere!o de uma carta entregue pelo correio, o envelope SOAP precisa das informa!<es espec5ficas do protocolo de transporte %ue est6 ligado a ele, com o intuito de garantir a c(egada ao local certo. >specificamente no =00P, temos um cabe!al(o %ue se c(ama SOAPAction, indicador do endere!o de entrega da mensagem. Am dos principais motivos de implementarmos o cabe!al(o desta maneira # por%ue administradores de sistemas podem configurar seus firewalls para filtrar as mensagens baseadas nas informa!<es dos cabe!al(os, sem consultar o &M . $lemento >nvelope Serializador SOAPB>DR SOAPB>D1 &si &sd Namespace + !" (ttp)**sc(emas.$mlsoap.org*soap*envelope (ttp)**sc(emas.$mlsoap.org*soap*encoding (ttp)**sc(emas.$mlsoap.org*soap*envelope (ttp)**sc(emas.$mlsoap.org*soap*encoding (ttp)**+++.+,.org*@QQQ*&M Sc(emaBinstance (ttp)**+++.+,.org*@QQQ*&M Sc(ema

0abela. Damespaces * AR3 padr<es do SOAP

?igura. >nvelope 1oncluindo, segundo Marcus Rommel, o SOAP # o elemento principal da infraB estrutura dos Web Services e um fator fundamental para o funcionamento dos mesmos, independente de plataformas, sistemas operacionais, modelos de ob2etos e linguagens de programa!"o, au$iliando muito a interoperabilidade entre ob2etos e componentes distribu5dos. >ste tem um papel muito importante e acaba com a disputa entre linguagens, garantindo %ue o programador possa desenvolver no ambiente %ue se2a mais ade%uado Us suas necessidades. Al#m de todas essas %ualidades, o fato tamb#m de n"o ser preciso o seu con(ecimento para sua utiliza!"o fazem do SOAP uma e$celente escol(a para o desenvolvimento de Web Services. O fato de n"o ser preciso o seu con(ecimento para a manipula!"o dos Web Services facilita a vida de %ual%uer programador. Risto %ue a maioria das linguagens 26 trazem classes implementadas deste protocolo, facilitando ainda mais a sua utiliza!"o. (ipos de dados (ipo de :alor $sd)int $sd)4oolean $sd)string $sd)float or $sd)double $sd)time3nstant SOAPB>D1)base]^ (ipo ,.Bbit signed integer A 4oolean value, @ or / String of c(aracters Signed floating point number Date*time 4ase]^Bencoded binar8 B@. @ =ello +ord B@..@// .//]B/PB./0//)//)/^B/Q)// a?_DSO`dsQ_ds,OaWVRQt$ $xemplo

0abela. Ralores escalares suportados pelo protocolo. SOAP tamb#m suporta tipos de dados arra8s e structs. S78P em =((P O SOAP teoricamente atua sobre %ual%uer protocolo de transporte, mas, sem davida nen(uma o (ttp # o protocolo mais utilizado para a utiliza!"o de Web Services.

Atrav#s do comando Post do =00P # poss5vel o envio das mensagens SOAP, utilizandoBse da AR3 re%uisitora %ue especifica um destino 3D. Do cabe!al(o do (ttp, tamb#m temos um campo com o nome do m#todo a ser c(amado. POS0 *rpcrouter =00P*@.@ =ost) @.`././.@ 1ontentB08pe) te$t*$ml[ c(arsetHutfBO 1ontentB engt() PPQ SOAPAction) S(ttp)**mauricio.comI 7M$ml versionHN0./N encodingHNutf3@NM9 7soap)>nvelope $mlns)$siHNSc)ema3"nstanceN $mlns)$sdHNSc)emaN $mlns)soapHN$nvelopeN9 7soap)4od89 71onverte $mlnsHN)ttp*++conv.com.brN9 7Ralor9A7*Ralor9 7De9D$C7*De9 7Para95"N7*Para9 7*1onverte9 7*soap)4od89 7*soap)>nvelope9 Atrav#s do =00P Response # %ue obtemos uma resposta da solicita!"o SOAP. Dote %ue alguns itens 26 n"o s"o mais necess6rios. =00P*@.@ .// O_ 1ontentB08pe) te$t*$ml[ c(arsetHutfBO 1ontentB engt() lengt( 7M$ml versionHN0./N encodingHNutf3@NM9 7soap)>nvelope $mlns)$siHNSc)ema3"nstanceN $mlns)$sdHNSc)emaN $mlns)soapHN$nvelopeN9 7soap)4od89 71onverteResponse $mlnsHN)ttp*++mauricio.comN9 7RalorResult90/07*RalorResult9 7*1onverteResponse9 7*soap)4od89 7*soap)>nvelope9

WSDL B 7 4ue CD Pra 4ue serveD 7nde utili?oD


Recentemente ten(o dedicado boa parte do pouco tempo %ue me sobra a con(ecer 'entendaBse, estudar- de forma mais estreita os modelos ar%uiteturais de comunica!"o remota entre aplica!<es. 1omo resultado destes estudos, ten(o produzido alguns posts %ue s"o nada mais nada menos %ue o refle$o dos conceitos %ue ten(o aprendido e colocado em pr6tica em algumas aplica!<es de meu diaBaBdia. O penJltimo post t#cnico %ue escrevi neste site, tratou 2ustamente de levantar os conceitos fundamentais relacionados ao modelo de comunica!"o R>S0. RocC pode efetuar a leitura deste post clicando a%ui. Da se%uCncia, escrevi um novo post apresentando o modelo em funcionamento com Razor e WebMatri$ 'este vocC pode ler a%ui-. Do post de (o2e, %uero falar um pouco sobre o modelo WSD 'Web Services Description Language-, um padr"o definido pela W,1 para especificar as atividades a serem realizadas pelo servi!o c(amado via RP1. !PC B Remote Procedure Calls RP1 'em portuguCs, c(amada de procedimentos remotos- # um modelo %ue define a forma como s"o realizadas as c(amadas a opera!<es remotas atrav#s de web services. O modelo descreve o funcionamento de c(amadas remotas, de forma semel(ante a c(amada de procedimentos locais. Assim, a diferen!a fundamental de um modelo em rela!"o ao outro consiste no fato de %ue, no modelo descrito pelo RP1, temos a presen!a marcante de duas figuras trabal(ando ativamente) o cliente e o servidor. 4asicamente, no modelo RP1 temBse uma thread respons6vel por gerir o processo de re%uisi!"o e resposta, %ue funciona da seguinte forma) @. O processo invocador 'A- faz uma re%uisi!"o ao processo servidor '4-. >n%uanto esta resposta n"o # devolvida com todos os par:metros, o processo A aguarda blo%ueado 'ou se2a, nen(uma outra opera!"o pode ser realizada por A-. A mensagem enviada por A, possui toda parametriza!"o necess6ria para a e$ecu!"o da mesma e posterior resposta por parte de 4. .. O processo 4 recebe a solicita!"o, e$trai os dados, processa a mesma e produz os resultados e devolve a resposta para A. Rale notar %ue, assim %ue a resposta foi despac(ada, 4 volta a esperar por uma nova re%uisi!"o. Deste modelo de comunica!"o, apenas um processo permanece ativo em determinado instante de tempo. Raria!<es do modelo RP1, permitem a comunica!"o ass5ncrona, mas este # um assunto para outro post. A ?igura @ apresenta o modelo de comunica!"o RP1.

?igura @) O modelo RP1 de comunica!"o interBprocessos WSDL B 7 4ue CD WSD # um documento proposto pela W,1 a partir de Lun(o de .//` escrito em &M %ue visa padronizar as descri!<es das funcionalidades ofereridas por web services de forma independente de plataforma ou linguagem. Possui basicamente duas finalidades) @. >$por os m#todos %ue determinado servi!o disponibilizar6 .. Possibilitar a localiza!"o de determinado servi!o 1omo mencionado anteriormente, WSD # escrito em &M , portanto, para %ue se possa elabor6Blo, # preciso acumular alguns con(ecimentos, tais como) &M Namespaces, &M Schemas, etc. Outro conceito importante relacionado a WSD # o fato de %ue ele trabal(a em parceria com outras duas tecnologias, sendo elas) ADD3 e SOAP. >m posts futuros, trataremos destes dois assuntos com maiores detal(es. Por (ora, basta mencionar %ue en%uanto WSD apresenta os recursos dispon5veis, ADD3 permite a publica!"o do servi!o e SOAP possibilita o tr6fego das informa!<es. WSDL B $lementos bEsicos 1omo mencionado anteriormente, WSD # um documento &M simples %ue descreve atrav#s de elementos espec5ficos, a estrutura dos servi!os web. Assim, sua estrutura # e$tremamente simplificada. A seguir apresentamos os principais elementos descritivos de um documento WSD .

%t'pes&) a%ui dever"o ser descritos os tipos de dados suportados pelo servi!o em %uest"o %message&) a%ui devem ser especificados os padr<es de entrada e sa5da de dados dos web services %port('pe&) a%ui devem ser descritos os agrupamentos l;gicos das opera!<es. S"o as opera!<es e$ecutadas pelo web service

%binding&) a%ui devem ser apresentados os protocolos de comunica!"o %ue os web services utilizam %operation&) regi"o %ue permite a especifica!"o das assinaturas dos m#todos disponibilizados %definitions&) elemento padr"o de todos os documentos WSD . Permite efetuar descri!<es sobre schemas e namespaces

Mais adiante neste post, analisaremos um ar%uivo WSD pronto para %ue possamos entender em n5vel pr6tico como se d6 a constru!"o do mesmo. WSDL B Namespaces Se vocC trabal(a com 1b, por e$emplo, 26 est6 acostumado com o conceito de namespaces. Para ar%uivos WSD , a ideia # rigorosamente a mesma, isto #, os conceitos de reaproveitamento e organiza!"o de c;digos s"o implementados tamb#m. A seguir, apresentamos os principais namespaces 26 dispon5veis para WSD .

)ttp*++sc)emas.xmlsoap.org+,sdl) namespace de WSD )ttp*++sc)emas.xmlsoap.org+,sdl+soap) namespace %ue permite a utiliza!"o de WSD com SOAP )ttp*++sc)emas.xmlsoap.org+,sdl+)ttp) namespace %ue permite =00P, E>0 e POS0 )ttp*++sc)emas.xmlsoap.org+,sdl+mime) namespace %ue permite a vincula!"o de M3M> aos WSD s )ttp*++sc)emas.xmlsoap.org+soap+encoding) namespace %ue permite a codifica!"o segundo padr"o SOAP )ttp*++sc)emas.xmlsoap.org+soap+envelope) namespace %ue permite a codifica!"o segundo padr"o SOAP @.@ )ttp*++,,,.,-.org+.//0+12LSc)ema3instance) namespace de inst:ncia definido pelo padr"o &M )ttp*++,,,.,-.org+.//0+12LS)ema) namespace de schemas definido conforme regras do &M

Sobre o exemplo deste post Agora %ue 26 fomos apresentados aos conceitos fundamentais sobre WSD , podemos estruturar um ar%uivo para %ue possamos aplicar os conceitos de forma satisfat;ria. 4asicamente e$istem duas formas para escrever ar%uivos WSD , sendo %ue, a forma escol(ida impacta tamb#m na forma como a associa!"o com o servi!o # realizada. As formas as %uais nos referimos s"o) manual 'onde o ar%uivo WSD # estruturado manualmente pelo desenvolvedor- e autom6tica 'gerado pela ferramenta onde o o servi!o # criado-. Se vocC optar por criar um servi!o utilizando Risual Studio ./@/ e W1?, por e$emplo, o ar%uivo WSD vai sendo gerado a medida %ue o servi!o # estruturado.

O %ue faremos # criar um servi!o de disponibiliza um m#todo %ue rea2usta o sal6rio informado de acordo com uma fai$a salarial fict5cia.

Criando o web service Para criar o servi!o, utilizarei o Mono Develop, entretanto, vocC pode utilizar o Risual Studio ou outra ferramenta %ual%uer de desenvolvimento %ue ser6 poss5vel obter o mesmo resultado. A istagem @ apresenta o c;digo do web service.
<%@ WebService Language="C#" Class="WebServiceReajusteDeSalario.WSReajusteSalario" %> using Syste ! using Syste .Web.Services! na es"ace WebServiceReajusteDeSalario # "ublic class WSReajusteSalario $ Syste .Web.Services.WebService # %Web&et'o() "ublic string CalculaReajusteSalario*string "Salario+ # string Salario,or ata(o = "Salario.Re"lace*"-"-"."+! i.*Salario,or ata(o == "" // Salario,or ata(o == string.0 "ty // Salario,or ata(o == null+ # return "0rro ao tentar calcular o reajuste1"! 2 else # (ouble (Salario = Convert.3oDouble*Salario,or ata(o+! i.*(Salario >=4 55 (Salario <=644.4+ # (Salario 7= 8.9! return Convert.3oString*(Salario+! 2 else i.*(Salario >= 648.4 55 (Salario <= 8444.4+ # (Salario 7= 8.:! return Convert.3oString*(Salario+! 2 else # (Salario 7= 8.;! return Convert.3oString*(Salario+! 2 2 2 2 2

istagem @) Servi!o %ue calcula o rea2uste de sal6rio

O c;digo do servi!o # simples e dispensa maiores coment6rios. 1omo estamos criando um servi!o ASM&, estamos trabal(ando com o protocolo SOAP no encapsulamento das informa!<es trafegadas e, portanto, precisamos de um ar%uivo WSD para apresentar a descri!"o do servi!o. A istagem . apresenta o c;digo do ar%uivo gerado pelo Mono Develop para o servi!o em %uest"o.
<<= l version="8.4" enco(ing="ut.>9"<> <(e.initions = lns$soa"="'tt"$??sc'e as.= lsoa".org?@s(l?soa"?" = lns$soa"8;="'tt"$??sc'e as.= lsoa".org?@s(l?soa"8;?" = lns$soa"enc="'tt"$??sc'e as.= lsoa".org?soa"?enco(ing?" = lns$s="'tt"$??@@@.@A.org?;448?B&LSc'e a" = lns$'tt"="'tt"$??sc'e as.= lsoa".org?@s(l?'tt"?" = lns$ i e="'tt"$??sc'e as.= lsoa".org?@s(l? i e?" = lns$t ="'tt"$?? icroso.t.co ?@s(l? i e?te=t&atc'ing?" = lns$s4="'tt"$??te "uri.org?" na e="WSReajusteSalario" targetCa es"ace="'tt"$??te "uri.org?" = lns="'tt"$??sc'e as.= lsoa".org?@s(l?"> <ty"es> <=s$sc'e a ele ent,or De.ault="Duali.ie(" targetCa es"ace="'tt"$??te "uri.org?" = lns$=s="'tt"$??@@@.@A.org?;448?B&LSc'e a"> <=s$ele ent na e="CalculaReajusteSalario"> <=s$co "le=3y"e> <=s$seDuence> <=s$ele ent inEccurs="4" a=Eccurs="8" na e=""Salario" ty"e="=s$string"?> <?=s$seDuence> <?=s$co "le=3y"e> <?=s$ele ent> <=s$ele ent na e="CalculaReajusteSalarioRes"onse"> <=s$co "le=3y"e> <=s$seDuence> <=s$ele ent inEccurs="4" a=Eccurs="8" na e="CalculaReajusteSalarioResult" ty"e="=s$string"?> <?=s$seDuence> <?=s$co "le=3y"e> <?=s$ele ent> <=s$ele ent na e="string" nillable="true" ty"e="=s$string"?> <?=s$sc'e a> <?ty"es> < essage na e="CalculaReajusteSalarioSoa"Fn"> <"art na e=""ara eters" ele ent="s4$CalculaReajusteSalario"?> <? essage> < essage na e="CalculaReajusteSalarioSoa"Eut"> <"art na e=""ara eters" ele ent="s4$CalculaReajusteSalarioRes"onse"?> <? essage> < essage na e="CalculaReajusteSalarioGtt"HetFn"> <"art na e=""Salario" ty"e="s$string"?> <? essage> < essage na e="CalculaReajusteSalarioGtt"HetEut"> <"art na e="Io(y" ele ent="s4$string"?> <? essage> < essage na e="CalculaReajusteSalarioGtt"JostFn"> <"art na e=""Salario" ty"e="s$string"?> <? essage> < essage na e="CalculaReajusteSalarioGtt"JostEut"> <"art na e="Io(y" ele ent="s4$string"?> <? essage> <"ort3y"e na e="WSReajusteSalarioSoa""> <o"eration na e="CalculaReajusteSalario"> <in"ut essage="s4$CalculaReajusteSalarioSoa"Fn"?> <out"ut essage="s4$CalculaReajusteSalarioSoa"Eut"?>

<?o"eration> <?"ort3y"e> <"ort3y"e na e="WSReajusteSalarioSoa"8;"> <o"eration na e="CalculaReajusteSalario"> <in"ut essage="s4$CalculaReajusteSalarioSoa"Fn"?> <out"ut essage="s4$CalculaReajusteSalarioSoa"Eut"?> <?o"eration> <?"ort3y"e> <"ort3y"e na e="WSReajusteSalarioGtt"Het"> <o"eration na e="CalculaReajusteSalario"> <in"ut essage="s4$CalculaReajusteSalarioGtt"HetFn"?> <out"ut essage="s4$CalculaReajusteSalarioGtt"HetEut"?> <?o"eration> <?"ort3y"e> <"ort3y"e na e="WSReajusteSalarioGtt"Jost"> <o"eration na e="CalculaReajusteSalario"> <in"ut essage="s4$CalculaReajusteSalarioGtt"JostFn"?> <out"ut essage="s4$CalculaReajusteSalarioGtt"JostEut"?> <?o"eration> <?"ort3y"e> <bin(ing na e="WSReajusteSalarioSoa"" ty"e="s4$WSReajusteSalarioSoa""> <soa"$bin(ing trans"ort="'tt"$??sc'e as.= lsoa".org?soa"?'tt""?> <o"eration na e="CalculaReajusteSalario"> <soa"$o"eration soa"Kction="'tt"$??te "uri.org?CalculaReajusteSalario" style="(ocu ent"?> <in"ut> <soa"$bo(y use="literal"?> <?in"ut> <out"ut> <soa"$bo(y use="literal"?> <?out"ut> <?o"eration> <?bin(ing> <bin(ing na e="WSReajusteSalarioSoa"8;" ty"e="s4$WSReajusteSalarioSoa"8;"> <soa"8;$bin(ing trans"ort="'tt"$??sc'e as.= lsoa".org?soa"?'tt""?> <o"eration na e="CalculaReajusteSalario"> <soa"8;$o"eration soa"Kction="'tt"$??te "uri.org?CalculaReajusteSalario" style="(ocu ent"?> <in"ut> <soa"8;$bo(y use="literal"?> <?in"ut> <out"ut> <soa"8;$bo(y use="literal"?> <?out"ut> <?o"eration> <?bin(ing> <bin(ing na e="WSReajusteSalarioGtt"Het" ty"e="s4$WSReajusteSalarioGtt"Het"> <'tt"$bin(ing verb="H03"?> <o"eration na e="CalculaReajusteSalario"> <'tt"$o"eration location="?CalculaReajusteSalario"?> <in"ut> <'tt"$url0nco(e(?> <?in"ut> <out"ut> < i e$ i eB l "art="Io(y"?> <?out"ut> <?o"eration> <?bin(ing> <bin(ing na e="WSReajusteSalarioGtt"Jost" ty"e="s4$WSReajusteSalarioGtt"Jost"> <'tt"$bin(ing verb="JES3"?>

<o"eration na e="CalculaReajusteSalario"> <'tt"$o"eration location="?CalculaReajusteSalario"?> <in"ut> < i e$content ty"e="a""lication?=>@@@>.or >urlenco(e("?> <?in"ut> <out"ut> < i e$ i eB l "art="Io(y"?> <?out"ut> <?o"eration> <?bin(ing> <service na e="WSReajusteSalario"> <"ort na e="WSReajusteSalarioSoa"" bin(ing="s4$WSReajusteSalarioSoa""> <soa"$a((ress location="'tt"$??8;L.4.4.8$9494?WSReajusteSalario.as ="?> <?"ort> <"ort na e="WSReajusteSalarioSoa"8;" bin(ing="s4$WSReajusteSalarioSoa"8;"> <soa"8;$a((ress location="'tt"$??8;L.4.4.8$9494?WSReajusteSalario.as ="?> <?"ort> <"ort na e="WSReajusteSalarioGtt"Het" bin(ing="s4$WSReajusteSalarioGtt"Het"> <'tt"$a((ress location="'tt"$??8;L.4.4.8$9494?WSReajusteSalario.as ="?> <?"ort> <"ort na e="WSReajusteSalarioGtt"Jost" bin(ing="s4$WSReajusteSalarioGtt"Jost"> <'tt"$a((ress location="'tt"$??8;L.4.4.8$9494?WSReajusteSalario.as ="?> <?"ort> <?service> <?(e.initions>

istagem .) 1;digo do ar%uivo WSD criado 1omo # poss5vel observar, o ar%uivo WSD possui todas as informa!<es sobre o servi!o criado, tais como) nome, encode, descri!"o do m#todo dispon5vel, M3M>, etc., e tudo isso, em um formato e$tremamente simples Y &M . A ?igura . apresenta o servi!o criado em funcionamento.

?igura .) Servi!o em e$ecu!"o

4om pessoal, por (o2e # isso. >spero %ue este post possa tCBlo a2udado a entender o conceito relacionado aos ar%uivos WSD e sua import:ncia no cone$to da comunica!"o de aplica!<es.

Web Services Description Language


A Web Services Description Language 'WSDL- # uma linguagem baseada em &M utilizada para descrever Web Services funcionando como um contrato do servi!o. 0rataB se de um documento escrito em &M %ue al#m de descrever o servi!o, especifica como acess6Blo e %uais as opera!<es ou m#todos dispon5veis. ?oi submetido ao W,1 por Ariba, 34M e Microsoft em mar!o de .//@ sendo %ue seu primeiro rascun(o foi disponibilizado em 2ul(o de .//.. A vers"o atual # ../[ a vers"o @.@ n"o foi endossada pelo W,1. O WSD @.. foi renomeado para ../ e aceita todos os m#todos de re%uisi!"o =00P 'n"o apenas E>0 e POS0-. WSD # utilizado para definir servi!os como uma cole!"o de endpoints 'endere!os de rede-, ou portas. A defini!"o abstrata de portas e mensagens s"o separadas do uso concreto de inst:ncias, permitindo o reuso de defini!<es. Ama porta # definida por associa!"o a um endere!o de rede com um binding reutiliz6vel, e uma cole!"o de portas definidas como servi!o. Mensagens s"o descri!<es abstratas dos dados a serem trocados. Recursos s"o e$postos pelo Web Services Interoperability WS!I "asic #rofile$ e frame+ork WSR?.

Objetos de WSDL 1.1


Servio Pode ser visto como um container para conjunto de funes de sistema que foram expostos a protocolo baseado em web; Porta No nada alm da definio do endereo ou ponto de conexo para o Web Service. representado tipicamente por uma !"# simples com $ttp; %indin& 'specifica a interface( define o estilo de SOAP binding )"P* ou +ocument, e transporte )protocolo S-.P,. Sees de binding tambm definem as operaes; /ipo de porta

- elemento 0port/1pe2 define um web service( as operaes que podem ser executadas( e as mensa&ens trocadas para executar a operao; -perao *ada operao pode ser comparada 3 um mtodo ou c$amada de funo em uma lin&ua&em de pro&ramao tradicional. .qui as aes soap so definidas e o tipo de mensa&em codificado; 4ensa&em /ipicamente( uma mensa&em corresponde a uma operao. . mensa&em contm as informaes necess5rias para executar a operao; 'lemento +efinidos com a ta& 0t1pes2( consistem em um nome 6nico e tipo de dado. Seu prop7sito descrever um dado e definir uma tag que delimite os dados enviados; .rquivos 8S+ 'lementos podem ser definidos em um esquema 84# 9 8S+ )84# Sc$ema +efinition,. Pode estar no mesmo arquivo :S+# ou em arquivo separado.

!egras Fteis do 12L


Mauricio Reckziegel >$tensible Markup anguage 'linguagem de marca!"o e$tens5vel-, foi desenvolvida no ano de @QQ] pelo W,1 'World Wide Web 1onsortium-, derivado de SEM 'Standard Eeneralized Markup anguage Y linguagem de marca!"o generalizada e$tens5vel -, e tem como sua principal caracter5stica seu formato de te$to simples e fle$5vel. ?oi desenvolvido com o intuito de ser uma metalinguagem fle$5vel, mas formal, permitindo a troca de dados entre institui!<es, atrav#s da 3nternet. SAma metalinguagem # uma linguagem %ue serve para descrever outras linguagens. Por e$emplo, vocC poderia dizer %ue um dicion6rio de inglCs e um livro de gram6tica inglesa formam 2untos uma metalinguagem para o inglCsI. Diferentemente do =0M '=8perte$t Markup anguage Y linguagem de marca!"o de (iperte$to-, a %ual foi desenvolvida para, especificamente, marcar documentos cient5ficos e acadCmicos utilizando con2untos de tags, o &M n"o cont#m tag alguma. 3sso l(e d6 a (abilidade de criar linguagens de marca!"o %ue realmente satisfa!am U sua aplica!"o espec5fica, ao contr6rio do =0M , o %ual n"o importa o %uanto se2a ruim a sua formata!"o. Eeralmente, os navegadores tentar"o mostrar o c;digo =0M , 26 a linguagem &M segue uma estrutura r5gida, interrompendo a sua e$ecu!"o assim %ue se debater com %ual%uer tipo de erro de marca!"o.

Devido U sua adaptabilidade, passou a ser utilizado para trocar informa!<es comple$as %ue n"o eram ade%uadamente e$pressas em =0M , como e%ua!<es matem6ticas e dados geogr6ficos. Apesar de muitas pessoas pensarem %ue o &M # um substituto para o =0M , essa afirma!"o n"o # e$atamente correta, pois o &M n"o nos possibilita a utiliza!"o de te$tos em negrito, it6lico, mas facilita a troca de dados, padronizando sua sem:ntica e tornando f6cil a interpreta!"o por programas sem a necessidade de profissionais. >n%uanto o =0M se preocupa em como mostrar o te$to, o &M se preocupa com o seu conteJdo. Por ser uma metalinguagem descritiva 'capaz de descrever e definir novas linguagens-, cada uma delas volta especificamente para um tipo de informa!"o. Atrav#s de um D0D 'Document 08pe Definition Y defini!"o de tipo de documento-, s"o definidas as estruturas do ar%uivo &M . Algumas destas especifica!<es s"o) &M Sc(ema, &S 0, DOM e SA&. !egras do 12L A principal regra do &M # a sua padroniza!"o dos formatos. Seu principal ob2etivo # evitar a incompatibilidade dos navegadores presentes no mercado, o %ue acontece geralmente com a linguagem =0M . Outra regra, 26 mencionada anteriormente, # %uanto a erros em sua e$ecu!"o. O processador &M ao encontrar um erro de marca!"o, interromper6 o processamento e mostrar6 uma mensagem de erro. Rigor con(ecido como tratamento de erros draconianos. Vuanto U classifica!"o, os documentos podem ser tanto com valida!"o, onde o processador verificar6 a estrutura do documento de acordo com regras especificas em uma D0D, e sem valida!"o, %uanto o processador s; verificar6 se o documento est6 de acordo com as regras do &M . >m um documento &M , o te$to # dividido em duas categorias principais) dados de caracteres e marca!"o. As marcas delimitadas por S7I e S9I ou SFI e S[I determinam a marca!"o do te$to. Os dados de caracteres s"o %uais%uer outros dados %ue n"o se2am de marca!"o. Algumas regras, segundo Miguel ?ornari, %ue ac(ei interessante salientar neste trabal(o) !egra /0* Am documento &M deve conter um ou mais elementos. !egra /.* O nome de um elemento deve ser igual na marca!"o 'tag- inicial e na marca!"o final. A tag final # indicada por uma barra S*I, antes do nome da tag. =6 diferencia!"o entre letras maiJsculas e letras minJsculas. !egra /-* >$iste um Jnico elemento, o elemento raiz, %ue n"o pode fazer parte do conteJdo de nen(um outro elemento.

!egra /G* Se a marca!"o inicial est6 dentro de um elemento, a marca!"o final tamb#m deve estar dentro do mesmo elemento. Simplificando) os elementos, delimitados pelas marca!<es inicial e final, devem estar anin(ados. !egra /A* O te$to entre a marca!"o inicial e a final # c(amado conteJdo do elemento. Am elemento sem conteJdo pode tomar uma forma especial 7nome*9. A barra antes do S9I substitui a marca!"o final. !egra /H* O nome dos elementos podem conter letras, d5gitos, (5fens ou underscores. Os nomes dos elementos %ue come!am com $ml, &M ou outra combina!"o dessa string s"o reservados por padr"o. !egra /I* Am elemento pode conter v6rios, um ou nen(um atributo. Os caracteres permitidos s"o os mesmos dos nomes de elementos. O nome do atributo # separado de seu valor por sinal de igualdade 'SHI-. O valor do atributo deve estar entre ap;strofes c\d ou aspas duplas N\N . Se ap;strofe ou aspas duplas for usadas no valor do atributo, ent"o o delimitador contr6rio deve ser usado. !egra /@* 1aracteres S7I e SFI n"o podem ser usados no te$to como s"o usados nas marca!<es. Se esses caracteres s"o necess6rios utilizaBse SFlt[I ao inv#s de S7I e SFamp[I ao inv#s de SFI. !egra /J* 1aracteres 9, N , e c podem ser substitu5dos por SFgt[I , SF%uot[I e SFapos[I , respectivamente. !egra 0/* 1oment6rios podem aparecer em %ual%uer lugar do documento fora de uma marca!"o. Am processador de &M pode, mas n"o necessariamente, tornar poss5vel a leitura desses coment6rios por uma aplica!"o. A string NYN 'dois (5fens- n"o pode ocorrer nos coment6rios. !egra 00* Se!<es 1DA0A s"o usadas para preservar blocos de te$to com caracteres %ue seriam interpretados como marca!"o. As se!<es 1DA0A come!am com a string N7We1DA0AeN e terminam com a string Nff9N. A se%KCncia cff9d n"o pode ocorrer dentro da se!"o 1DA0A. !egra 0.* Documentos &M podem, e deveriam, come!ar com uma declara!"o &M %ue especifica a vers"o do &M %ue est6 sendo usada e do con2unto de caracteres utilizado.