XML: uma introdução prática <xml:introdução /> Helder da Rocha www.argonavis.com.br 1
Objetivos Oferecer uma visão geral da tecnologia XML Responder às questões Como implementar soluções de gestão de informações usando XML? Quando e como usar as tecnologias e linguagens que viabilizam o compartilhamento de informações? Apresentar Breve introdução ao XML e tecnologias relacionadas. Recursos para manipular informações representadas em XML: ferramentas, linguagens e tecnologias 2
Por que XML? Onde usar XML? Como produzir documentos XML Documentos válidos: DTD e XML Schema Assuntos abordados Manipulação via programação em DOM e SAX Transformação: XSLT e XPath Localização e extração: XLink, XQuery e XPointer Visualização: XSL-FO e SVG Demonstração: geração de HTML, RTF e PDF Ferramentas e Conclusões 3
O que é XML? extensible Markup Language: padrão W3C Uma maneira de representar informação não é uma linguagem específica não define vocabulário de comandos não define uma gramática, apenas regras mínimas Exemplo: documento XML usuario_33.xml <contato codigo="33"> <nome>severino Severovitch</nome> <email>bill@norte.com.br</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> elemento atributo "nó" de texto 4
XML versus HTML HTML mostra como apresentar XML mostra o que significa <h1>severino Severovitch</h1> <h2>bill@norte.com.br</h2> <p> <b>11</b> <i>9999 4321</i> </p> <nome>severino Severovitch</nome> <email>bill@norte.com.br</email> <telefone> <ddd>11</ddd> <numero>9999 4321</numero> </telefone> 5
Anatomia de um documento XML Documentos XML são documentos de texto Unicode É uma hierarquia de elementos a partir de uma raiz Menor documento tem um elemento (vazio ou não): <nome> Ñåâåðèíî Ñåâåðîâè </nome> Menor documento contendo elemento vazio Elemento raiz <nome></nome> = <nome/> Menor documento contendo elemento e conteúdo texto <nome> Ñåâåðèíî Ñåâåðîâè </nome> Etiqueta inicial Conteúdo do Elemento Etiqueta final 6
Partes de um documento elemento raiz declaração XML nó raiz ( / ) <?xml version="1.0" encoding="iso-8859-1"?> atributos <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> elementos <numero>2313011</numero> </telefone> </cartao-simples> 7
/ cartao-simples nó raiz elemento raiz Árvore XML email nome dumont@14bis.com.br Alberto Santos Dumont telefone endereco Rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ logotipo href numero ddd /imagens/logo14bis.gif 2313011 tipo residencial 21 LEGENDA nó de elemento nó de atributo nó de texto 8
XML Namespaces Limita o escopo de elementos Evita conflitos quando duas linguagens se cruzam no mesmo documento Consiste da associação de um identificador a cada elemento/atributo da linguagem, que pode ser herdado através do escopo de uma sub-árvore atribuído explicitamente através de um prefixo Exemplo prefixo identificador <cadastro xmlns:firma="01.234.567/0001-99"> <nome>severino Severovitch</nome> <firma:nome>sibéria Informática Ltda.</firma:nome> <email>bill@norte.com.br</email> </cadastro> Este elemento <nome> pertence a outro namespace 9
Por que usar XML para compartilhar dados? Porque é um padrão aberto Facilidade para converter para formatos proprietários Porque é texto Fácil de ler, fácil de processar, menos incompatibilidades Porque promove a separação entre estrutura, conteúdo e apresentação Facilita geração de dados para visualização dinâmica Evita repetição de informação / simplifica manutenção Porque permitirá semântica na Web Elementos HTML não carregam significado, apenas dicas de formatação: mecanismos de busca ficam prejudicados Solução com XML dependerá de suporte dos clientes 10
Onde usar XML? Dados armazenados em XML podem ser facilmente transformados em outros formatos texto <xml> <xml> <xml> "custom" XML XSLT <xml> <xml> WML VoiceXML Web VRML W HTML CSS JavaScript DOM SAX XSL-FO PDF PDF PDF RTF TeX SGML SGBD Gráficos SVG Imagens JPG e PNG 2000 2001 PDF e PostScript 11
Como produzir XML Criando um documento de texto Unicode a partir de qualquer editor de textos <contato codigo="33"> <nome>severino Severovitch</nome> <email>bill@norte.com.br</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> Gerando um documento a partir de uma árvore montada dinamicamente 33 Severino Severovitch bill@norte.com.br celular 11 9999 4321 <contato codigo="33"> <nome>severino Severovitch</nome> <email>bill@norte.com.br</email> <telefone tipo="celular"> <area>11</area> <numero>9999 4321</numero> </telefone> </contato> 12
Documentos XML bem formados Para que possa ser manipulado como uma árvore, um documento XML precisa ser bem formado Documentos que não são bem formados não são documentos XML Documentos bem-formados obedecem as regras de construção de documentos XML genéricos Regras incluem Ter um, e apenas um, elemento raiz Valores dos atributos estarem entre aspas ou apóstrofes Atributos não se repetirem Todos os elementos terem etiqueta de fechamento Elementos estarem corretamente aninhados 13
XML válido Um XML bem construído pode não ser válido em determinada aplicação Aplicação típica pode esperar que elementos façam parte de um vocabulário limitado, certos atributos tenham valores e tipos definidos, elementos sejam organizados de acordo com uma determinada estrutura hierárquica, etc. É preciso especificar a linguagem! Esquema: modelo que descreve todos os elementos, atributos, entidades, suas relações e tipos de dados Um documento XML é considerado válido em relação a um esquema se obedecer todas as suas regras 14
Esquema Documentos que aderem à especificação (válidos) O esquema representa uma classe Os documentos são instâncias Documento fora da especificação Esquema (universo de documentos válidos) Como definir esquemas: DTD - Document Type Definition W3C XML Schema 15
DTD vs. XML Schema Um esquema é essencial para que haja comunicação usando XML Pode ser estabelecido "informalmente" (via software) Uso formal permite validação usando ferramentas genéricas de manipulação de XML Soluções DTD <!ELEMENT contato (nome, email, telefone)> <!ATTLIST contato codigo NMTOKEN #REQUIRED> XSchema <xsd:schema xmlns:xsd=".../xmlschema"> <xsd:element name="contato"> <xsd:complextype> <xsd:attribute name="codigo" use="required"> Simples mas não é XML Não suporta namespaces Limitado quando a tipos de dados É XML, porém mais complexo Suporta namespaces Permite definição de tipos 16
Visualização em um browser Folha de estilo: conjunto de regras para formatar ou transformar as informações de um documento XML CSS - Cascading Style Sheets Transformação visando apresentação visual Aplicação do estilo em tempo de execução no cliente XSLT - extensible Stylesheet Language Transformação em texto, HTML ou outro formato Aplicação em tempo real ou prévia (no servidor) Se não estiver associado a uma folha de estilo, o documento XML não tem uma "aparência" definida Internet Explorer e outros mostram a árvore-fonte XML Netscape mostra apenas os nós de texto 17
Como manipular XML? Há duas APIs padrão para manipular (interpretar, gerar, extrair dados e tratar eventos) arquivos XML: W3C Document Object Model (W3C DOM) Simple API for XML (SAX) Servem a finalidades diferentes Implementações disponíveis em várias linguagens SAX oferece métodos que respondem a eventos produzidos durante a leitura do documento notifica quando um elemento abre, quando fecha, etc. DOM monta uma árvore, que permite a navegação na estrutura do documento propriedades dos objetos podem ser manipuladas 18
Leitura de XML com SAX Se um processador SAX receber o documento... <carta> <mensagem id="1">bom dia!</mensagem> </carta>... ele irá disparar a seguinte seqüência de eventos: startdocument() startelement("carta", []) startelement("mensagem", [Attribute("id","1")]) characters("bom dia!") endelement("mensagem") endelement("carta") enddocument() Programador deve implementar um objeto "ouvinte" para capturar os eventos e extrair as informações desejadas 19
Criação de documentos com DOM (1) Criação dos elementos / Document Obter objeto do tipo Document (raiz) (dependente de processador): doc <carta> Element carta = doc.createelement("carta") <mensagem> Element mens = doc.createelement("mensagem") Bom dia! String texto = doc.createtextnode("bom dia!") Atributos <mensagem id="1"> mens.setattribute("id", "1") 20
Criação de documentos com DOM (2) Montagem da árvore passo-a-passo 1. Sub-árvore <mensagem> <mensagem id="1"> mens.appendchild(texto) 3. Árvore completa / Bom dia! 2. Sub-árvore <carta> <carta> <mensagem id="1"> <carta> <mensagem id="1"> carta.appendchild(mens) Bom dia! Bom dia! doc.appendchild(carta) 21
XPath Linguagem usada para navegar na árvore XML Uma expressão XPath é um caminho* na árvore que resulta em um valor (número, texto, booleano), objeto (elemento, atributo, nó de texto) ou conjunto de objetos 33 Severino Severovitch bill@norte.com.br celular 11 9999 4321 Caminhos absolutos /contato/@codigo /contato/telefone/@tipo /contato/telefone/numero/text() Relativos ao contexto /contato: @codigo (ou./@codigo) telefone/@tipo (ou./telefone/@tipo) telefone/numero/text() Expressões XPath são usadas dentro de atributos XML Usadas em XSLT, XLink, XQuery e XPointer * pode também ser padrão de busca 22
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="livro/titulo"> <td><xsl:value-of select="." /></td> XSLT XSL Transformations Linguagem (XML) para criação de documentos que contêm regras de transformação para documentos XML Documentos escritos em XSLT são chamados de folhas de estilo e contêm Elementos XSLT: <template>, <if>, <foreach>,... Expressões XPath para localizar nós da árvore-fonte Texto ou XML a ser gerado no documento-resultado Processador XSLT fontetohtml.xslt Folha de estilos fonte.xml Documento Fonte Processador XSLT Xalan, TrAX, Saxon Netscape, I. Explorer Documento Resultado 23
XSLT: documento-fonte (1) Considere o seguinte documento-fonte: <aeronave id="ptgwz"> <origem partida="08:15">rio de Janeiro</origem> <destino>itabuna</destino> </aeronave> / <aeronave> @id PTGWZ <origem> Rio de Janeiro Árvore-fonte <destino> @partida Itabuna 08:15 24
XSLT: folha de estilos (2) O seguinte template (parte de uma folha de estilos XSLT) pode extrair os dados do documento-fonte documento resultado (em preto) <xsl:template match="aeronave"> <p>a aeronave de prefixo <xsl:value-of select="@id" /> decolou de <xsl:value-of select="origem" /> às <xsl:value-of select="origem/@partida" /> tendo como destino o aeroporto de <xsl:value-of select="destino" />.</p> </xsl:template> documento-fonte (em azul - XPath) elementos XSLT (em vermelho, com prefixo xsl) Elementos XSLT geralmente são usados com um prefixo associado ao seu namespace: <xsl:elemento> para evitar conflitos com o documento-resultado. 25
XSLT: documento-resultado (3) Após a transformação, o resultado será <p>a aeronave de prefixo PTGWZ decolou de Rio de Janeiro às 8:15 tendo como destino o aeroporto de Itabuna.</p> Para obter outros resultados e gerar outros formatos com os mesmos dados, deve-se criar folhas de estilo adicionais 26
XLink, XPointer e XQuery XLink: é uma especificação W3C que permite definir vínculos entre documentos XML Funcionalidade mínima é igual ao <a href> do HTML Funcionalidade estendida permite vínculos bidirecionais, arcos, vários níveis de semântica, etc. É uma coleção de atributos, com namespace próprio, que podem ser usados em elementos de qualquer linguagem XML. XPointer: aponta para partes de documentos XML Identificador (ID) colocado no destino, accessível através de fragmento de URL: xlink:href="#identificador" Caminho resultante de expressão XPath: xpointer(/livro/id) XQuery: linguagem para pesquisar documentos XML Exemplo: FOR $b IN document("usuario_33.xml")/contato WHERE nome="severino Severovitch" RETURN $b 27
<fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> XSL-FO XSL Formatting Objects Linguagem XML de descrição de página com os mesmos recursos que PostScript ou PDF Descreve o layout preciso de texto e imagens Possui centenas de elementos, atributos e propriedades (que são semelhantes às propriedades do CSS) Páginas são facilmente convertidas para PDF e PostScript Ideal para gerar documentos para impressão (livros, etc.) Normalmente gerada via XSLT XML XML XSLT Fonte Processador XSLT XML Documento XSLFO FOP Documento PDF 28
XSL-FO: menor documento <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> Este é o "<head>" <fo:layout-master-set> do XSL-FO <fo:simple-page-master master-name="p1"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-name="p1"> <fo:flow flow-name="xsl-region-body"> <fo:block color="blue" font-size="20pt"> Hello PDF! </fo:block> </fo:flow> </fo:page-sequence> Ligação entre as regras de layout e o conteúdo afetado Este é o "<body>" do XSL-FO </fo:root> 29
<html xmlns="http://www.w3.org/1999/xhtml"> <head><title>página XHTML</title></head> <body> <h1>página XHTML</h1> XHTML extensible HTML Linguagem XML de descrição de página Web Mesmos elementos do HTML 4.0 Strict Elementos descrevem somente a estrutura dos componentes da página. A forma precisa ser especificada usando CSS: não há elementos/atributos para mudar cor, alinhamento, etc. Pode ser misturada (estendida) com outras linguagens XML (MathML, SVG, linguagens proprietárias) Normalmente gerada via XSLT XML XML XSLT Documento Fonte Processador XSLT XML Documento XHTML 30
<svg> <circle style="fill: red" cx="3cm" cy="3cm" r="2.5cm" /> <rect style="fill: blue" x="6cm" y="6cm" height="2.5cm" width="1.5cm" /> SVG W3C Scalable Vector Graphics Gráficos vetoriais em XML Plug-ins para principais browsers: concorre com Flash Suporta animações, links, JavaScript, CSS Produzido por ferramentas como Adobe Ilustrator Pode ser embutido no código XHTML e XSL-FO Zoom + Zoom + 31
Exemplo de SVG JavaScript <svg width="10cm" height="10cm"> <g onclick="alert('clicou no grupo 1!')"> <circle style="fill: red" CSS cx="3cm" cy="3cm" r="2.5cm" /> <rect style="fill: blue" x="6cm" y="6cm" height="2.5cm" width="1.5cm" /></g> <g onclick="alert('clicou no grupo 2!')"> <circle style="fill: green; opacity: 0.5" cx="5cm" cy="5cm" r="2cm" /></g> <a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/graphics/svg"> <text style="color: black; font-family: tahoma; font-size: 12pt" x="3cm" y="8cm"> SVG é XML</text></a> </svg> XLink 32
Algumas outras linguagens XML MathML WML VoiceXML Classe oper(): void oper2(): int XMI 1 * Classe2 oper(): void oper2(): int Classe3 oper(): void oper2(): int Web Services SOAP WSDL UDDI ebxml XML-RPC CML 33
Demonstração Exemplo de transformação XML PDF <xml> <xslt> FO (1) <xsl:fo> FOP (1.a) (1.b) Xalan (3) <xslt> SVG JFOR W <xslt> Texto (4) (2) Texto texto texto texto texto texto texto texto texto <xslt> HTML HTML 2000 2001 SVG 34
Ferramentas Para programação Parsers-validadores: Xerces, Crimson, MSXML 4.0 Validadores: MSV (Sun) Transformadores XSL: TrAX, Xalan, Xt, Saxon APIs: JDOM, JAX (P, B, M, R, RPC), SAX e DOM Veja mais em xml.apache.org e www.alphaworks.ibm.com Para edição (de XML genérico) XML Spy Suite Framemaker / ArborText JEdit com plug-ins para XML, XSLT e XPath Veja mais em www.w3.org/xml/ 35
Conclusões XML é uma ótima solução para compartilhar dados Para implementar soluções em gestão de informações usando XML, pode-se usar DTD ou XSchema para especificar o modelo de dados e validar as informações As APIs DOM ou SAX para extrair dados dos documentos, gerar documentos, ler e gravar em bancos de dados XSLT e XPath para transformar os dados em outros formatos XLink, XPointer e XQuery para criar vínculos lógicos entre os documentos e localizar seus componentes XSL-FO ou XHTML para formatar os dados para impressão ou visualização na tela (PDF, Word ou Web) SVG para gerar informações em forma de gráfico vetorial 36
Fontes [1] World Wide Web Consortium (W3C). extensible Markup Language. http://www.w3.org/xml/. Ponto de partida e principal fonte sobre XML e suas tecnologias "satélite". Contém últimas especificações de XML, XPath, XSchema, XSLT, XSL-FO, XQuery, XLink, XPointer, SVG, XHTML, CSS. [2] Eric Armstrong et al. Working with XML. Aborda DOM, SAX e XML com Java. http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/index.html. [3] Adobe. SVG Tutorial. http://www.adobe.com/svg/. Contém tutorial sobre SVG e links para o plug-in SVG da Adobe (Win/Mac). [4] IBM Developerworks. http://www-106.ibm.com/developerworks/. Diversos tutoriais e artigos sobre XML, XSLT, DOM e SAX usando geralmente Java. [5] Doug Tidwell. XSLT. O Reilly & Associates, 2001. Explora XSLT com aplicações práticas em Java. [6] Elliotte Rusty Harold. XML Bible, Second Edition, 2001. Aborda todas as principais tecnologias W3C. 5 capítulos em http://cafeconleche.org/books/bible2/ [7] Erik T. Ray. Learning XML. O Reilly & Associates, 2001. Introdução ao XML e DTD, XSLT, XLink e XPointer (os dois últimos baseados em especificações draft). 37
helder@ibpinet.net www.argonavis.com.br 38
XML: uma introdução prática <xml:fundamentos /> Helder da Rocha www.argonavis.com.br 1
Como criar um documento XML XML não estabelece nenhum vocabulário mas apenas regras mínimas de estrutura Para criar o menor arquivo XML possível: Abra um editor de textos Salve o arquivo com extensão.xml Escreva um elemento raiz vazio <x/> Salve o arquivo Abra no Internet Explorer 2
Um dos menores documentos XML <nome> Fulano de Tal </nome> Um elemento Elemento raiz <nome> Fulano de Tal </nome> Etiqueta inicial Conteúdo do Elemento Etiqueta final 3
Elemento vazio <nome></nome> <nome/> 4
Elementos podem conter elementos fulano_de_tal.xml <contato> <nome>fulano de Tal</nome> <email>fulano@site.com.br</email> <telefone> <ddd>11</ddd> <numero>8765 4321</numero> </telefone> </contato> 5
Componentes de um documento Árvore XML nós, raiz, galhos e folhas Prólogo Comentários Instruções de processamento Elementos Atributos Nós de texto Entidades 6
Estrutura XML Um documento XML pode ser representado como uma árvore. A estrutura é formada por vários nós. <?xml version="1.0" encoding="iso-8859-1"?> <!-- Isto é um comentário --> informações usadas <cartao-simples> pelo processador XML <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> </cartao-simples> um "nó" pode ser... um elemento, um atributo, um bloco de texto, um comentário, uma instrução, uma declaração, uma entidade,... 7
Prólogo Declaração XML Comentário Instrução de processamento Declaração de tipo de documento <?xml version="1.0" encoding="iso-8859-1"?> <!-- Isto é um comentário --> <?comando tipo="simples" parametro?> <!DOCTYPE cartao-simples SYSTEM "cartoes.dtd"> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> </cartao-simples> 8
Nó raiz e elementos elemento raiz nó raiz ( / ) <?xml version="1.0" encoding="iso-8859-1"?> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> elementos <numero>2313011</numero> </telefone> </cartao-simples> elementos 9
Só podem conter um descendente (só texto) <?xml version="1.0" encoding="iso-8859-1"?> Atributos <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> atributos </cartao-simples> 10
Nós de texto Não podem ter descendentes (são as folhas da árvore) <?xml version="1.0" encoding="iso-8859-1"?> <cartao-simples> <logotipo href="/imagens/logo14bis.gif" /> <nome>alberto Santos Dumont</nome> <endereco>rua do Encanto, 22-2o. andar - Centro - 25600-000 - Petrópolis - RJ</endereco> <email>dumont@14bis.com.br</email> <telefone tipo="residencial" > <ddd>21</ddd> <numero>2313011</numero> </telefone> </cartao-simples> nós de texto 11
Entidades São constantes associadas a um valor de texto Podem aparecer em qualquer lugar do documento Substituídas durante o processamento do documento Sintaxe: &ENTIDADE; Exemplo: &data_de_hoje; Entidades pré-definidas: < que corresponde a < > que corresponde a > & que corresponde a & " que corresponde a " ' que corresponde a ' 12
Entidades de caracteres Substituídas durante o processamento do documento Sintaxe: &#CÓDIGO_16b_decimal; ódigo_16b_hexadecimal; Exemplo: ou Um espaço em Unicode Veja em www.unicode.org/charts/ 13
Elementos e atributos Regras básicas Etiqueta inicial e final têm que ter o mesmo nome (considerando diferença de maiúscula e minúscula) Não pode haver espaço depois do < nas etiquetas iniciais nem depois do </ nas finais Atributos têm sempre a forma nome="valor" ou nome = 'valor': aspas podem ser usadas entre apóstrofes e apóstrofes podem ser usados entre aspas aspas e apóstrofes não podem ser neutralizados mas sempre podem ser representados pelas entidades ' e " Não pode haver atributos na etiqueta final 14
Elementos e atributos (2) Elementos mal formados <Profissão>Arquiteto</profissão> <TR><TD>item um</td></tr> <ÄÅÍÃÈÉ>139.00</äåíãèé> Há várias maneiras de representar a mesma informação em XML <data>23/02/1998</data> <data dia="23" mes="02" ano="1998" /> <data> <dia>23</dia> <mes>02</mes> <ano>1998</ano> </data> 15
Quando usar elementos/atributos Questão de design Elementos geralmente referem-se a coisas que têm atributos Atributos geralmente são características dessas coisas que podem ser descritas com poucas palavras Questão de suporte tecnológico Atributos não podem conter subelementos Atributos são mais fáceis de serem validados num DTD 16
Nomes de atributos e elementos Podem conter qualquer caractere alfanumérico ou ideograma. (ponto) - (hífen) _ (sublinhado) Não podem começar com ponto, hífen ou número Identificadores 17
Identificadores Elementos bem formados <αριστοτελεσ>περι ποιητικησ</αριστοτελεσ αριστοτελεσ> <êíèãà xml:lang='ru'> <íàçâàíèå>åâãåíèé Îíåãèí</íàçâàíèå> <àâòîð ðîæäåíèå="1799" ñìåðòü="1837">àëåêñàíäð Ñåðãååâè Ïóæêèí</àâòîð> </êíèãà> <_1_/> <cdd:gen.inf cdd:cod="005">introdução a XML</cdd:gen.inf> Elementos mal formados <3-intro>Fundamentos</3-intro> <cartão de crédito>1234567887654321</cartão de crédito> 18
Conteúdo misto <trecho> <secao>2</secao> <paragrafo>a unidade de informação dentro de um documento XML é o <definicao>elemento</definicao>. Um elemento é formado por duas <definicao>etiquetas</definicao> que atribuem algum significado ao conteúdo. </paragrafo> </trecho> 19
Ignora efeitos especiais dos caracteres Seção CDATA <titulo>curso de XML</titulo> <exemplo>considere o seguinte trecho de XML: <![CDATA[ <empresa> <nome>joão & Maria S/A</nome> </empresa> ]]> </exemplo> 20
Instruções de processamento Instruções dependentes do processador Funcionam como comentários para os processadores que não a conhecem <?nome-do-alvo área de dados?> <?query-sql select nome, email from agenda where id=25?> 21
Comentários Iguais aos comentários HTML <!-- Isto é um comentário --> <!-- isto é um erro -- sério! --> 22
Declaração XML Opcional (exceto queno conjunto de caracteres usado for diferente de UTF-8 <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> 23
Documento bem formado ter um único elemento raiz etiquetas iniciais e finais combinam (levando em conta que caracteres maiúsculos e minúsculos são diferentes) elementos bem aninhados valores de atributos entre aspas ou apóstrofes atributos não repetidos identificadores válidos para elementos e atributos comentários não devem aparecer dentro das etiquetas sinais < ou & nunca devem ocorrer dentro dos valores dos atributos ou nos nós de texto do documento. 24
XML Namespaces Permite que elementos de mesmo nome de diferentes aplicações sejam misturados sem que haja conflitos Um namespace (universo de nomes) é declarado usando atributos reservados xmlns="identificador" (namespace default) associa o identificador com todos os elementos que não possuem prefixo. Ex: <nome> xmlns:prefixo="identificador" associa o identificador com os elementos e atributos cujo nome local é precedido do prefixo. Ex <prefixo:nome> O prefixo é arbitrário e só existe dentro do documento O identificador (geralmente uma URI) deve ser reconhecido pela aplicação 25
Vale para todo o elemento <cartao> Esta URI está associada a este prefixo Exemplo <ct:cartao xmlns:ct="01.234.567/0001-89/cartoes"> <ct:nome>alberto Santos Dumont</ct:nome> <ct:endereco>rua do Encanto, 22 - Centro 25600-000 - Petrópolis - RJ</ct:endereco> <ct:email>dumont@14bis.com.br</ct:email> <ct:telefone tipo="residencial"> <ct:ddd>21</ct:ddd> <ct:numero>2313011</ct:numero> </ct:telefone> </ct:cartao> 26
Exemplo com 3 namespaces <departamento Namespace xmlns:ct="01.234.567/0001-89/cartoes" default xmlns="01.234.567/0001-89/empresa" xmlns:html="http://www.w3.org/1999/xhtml"> <ct:nome>fulano de Tal</ct:nome> URI padrão <nome>contabilidade</nome> XHTML <endereco>rua Projetada, 33</endereco> <html:a href="web.html"> <html:strong>link negrito HTML</html:strong> </html:a> <urgencia><ct:numero>2313011</ct:numero></urgencia> </departamento> 27
XML: uma introdução prática <xml:links /> Helder da Rocha www.argonavis.com.br 1
XLink é uma coleção de atributos Namespace: http://www.w3.org/1999/xlink Sete atributos: type = simple extended locator arc title resource href = a URI destino do vínculo show = new replace embed other none actuate = onload onrequest other none title = descrição detalhada role = papel / contexto do vínculo label = descrição sucinta (para exibição) Exemplo de uso típico <elemento xlink:href="http://lugar.com" /> 2
Exemplos: link "tipo <a href>" e "<img>" <p xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="#end" xlink:show="replace" xlink:actuate="onrequest">link</p> Conteúdo será substituído..... quando o usuário solicitar. <img xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="12345.jpg" xlink:show="embed" xlink:actuate="onload" /> carregado. Conteúdo será embutido no documento..... quando o documento for 3
XPointer Função que recebe uma expressão XPath Serve para apontar para um recurso ou parte do documento Para apontar para um recurso descoberto por uma expressão XPath xpointer(expressão) Quando há campos marcados com ID no documento destino, pode-se usar um ponteiro #ponteiro xpointer(expressão)#ponteiro 4
XML: uma introdução prática <xml:transformação/> Helder da Rocha www.argonavis.com.br 1
Esta aula Introdução a XSLT fundamentos: principais elementos passo-a-passo: como transformar Fundamentos de XPath linguagem para manipular árvores XSLT outros elementos Fundamentos de XSL-FO Exercícios Geração de HTML, XHTML, XML, XSL-FO, texto,... 2
Por que transformar Converter para um formato mais útil Atualizar documentos escritos em uma aplicação XML obsoleta Devolver resultados adequados para o cliente que irá usálos Gerar formatos para exibição depuração edição transmissão 3
XSLT XSL Transformations Linguagem (XML) para criação de documentos que contêm regras de transformação para documentos XML Documentos escritos em XSLT são chamados de folhas de estilo e contêm Elementos XSLT: <template>, <if>, <foreach>,... Expressões XPath para localizar nós da árvore-fonte Texto ou XML a ser gerado no documento-resultado Processador XSLT fontetohtml.xslt Folha de estilos fonte.xml Documento Fonte Processador XSLT Xalan, TrAX, Saxon Netscape, I. Explorer Documento Resultado 4
Transformação XSL A transformação XSL pode ocorrer em várias etapas, no cliente e/ou no servidor No servidor, há maior flexibilidade: Arquivos XML podem ser mesclados Informações podem ser extraídas de vários arquivos para inclusão em outro arquivo Por exemplo: um índice Arquivo resultante pode ser XML, HTML, RTF ou qualquer outro formato Browser não precisa suportar XML 5
Transformação XSL no cliente Em browsers que suportam XML e XSL, a transformação dos dados pode ser realizada no cliente Browser deve ser capaz de entender XML e XSL O resultado gerado pode ser XML ou HTML 4.0 (para maior suporte) Além da transformação XSL, no servidor ou cliente, a página pode ainda ser formatada com CSS. 6
Transformação XSLT No servidor Servidor XML CSS XSL No cliente CSS HTML Cliente Página Servidor CSS CSS Cliente XML XSL XML XSL Página 7
Fundamentos de transformação A transformação XSLT é realizada sobre a árvore de um documento-fonte Todos os nós do documento são acessíveis. Tipos de nó disponíveis: Elemento Atributo Texto Comentário Instrução de processamento Namespace Raiz 8
XSLT: documento-fonte (1) Considere o seguinte documento-fonte: <aeronave id="ptgwz"> <origem partida="08:15">rio de Janeiro</origem> <destino>itabuna</destino> </aeronave> / <aeronave> @id PTGWZ <origem> Rio de Janeiro Árvore-fonte <destino> @partida Itabuna 08:15 9
XSLT: folha de estilos (2) O seguinte template (parte de uma folha de estilos XSLT) pode extrair os dados do documento-fonte documento resultado (em preto) <xsl:template match="aeronave"> <p>a aeronave de prefixo <xsl:value-of select="@id" /> decolou de <xsl:value-of select="origem" /> às <xsl:value-of select="origem/@partida" /> tendo como destino o aeroporto de <xsl:value-of select="destino" />.</p> </xsl:template> documento-fonte (em azul - XPath) elementos XSLT (em vermelho, com prefixo xsl) Elementos XSLT geralmente são usados com um prefixo associado ao seu namespace: <xsl:elemento> para evitar conflitos com o documento-resultado. 10
XSLT: documento-resultado (3) Após a transformação, o resultado será <p>a aeronave de prefixo PTGWZ decolou de Rio de Janeiro às 8:15 tendo como destino o aeroporto de Itabuna.</p> Para obter outros resultados e gerar outros formatos com os mesmos dados, deve-se criar folhas de estilo adicionais 11
<template> Bloco para transformação recursiva Atributo match: contém expressão XPath para localização de padrão (não é caminho) Nó de contexto: dentro do <template>, todas as expressões XPath são relativas ao nó corrente e lista de nós correntes Padrão para combinação <xsl:template match="elem/filho"> [[[<xsl:value-of select="." />]]] </xsl:template> Caminho relativo 12
<value-of> Imprime o valor do nó indicado pelo seu atributo "select" Converte todo o conteúdo para texto Caminho relativo ao nó corrente. <xsl:template match="contxt"> <xsl:value-of select="elemento" /> </xsl:template> No exemplo acima, select seleciona qualquer nó que contenha o string contxt/elemento Use "." para valor de elemento corrente Use "/" para referir-se a caminhos absolutos 13
<text> Imprime texto Preserva espaços, novas-linhas e tabuações Útil para controlar forma de impressão do texto <xsl:template match="x"> <xsl:text>quebra linha depois </xsl:text> </xsl:template> <xsl:template match="y"> <xsl:text>não quebra linha</xsl:text> </xsl:template> Atributo disable-output-escaping="yes" evita substituição de entidades 14
<output> Para produzir resultados diferentes de XML e definir formato de dados de saída texto <xsl:output method="text" /> html <xsl:output method="html" /> xml com DTD <xsl:output method="xml" doctype-public="-//pid//en" doctype-system="arquivo.dtd" /> Formatos diferentes de UTF-8 <xsl:output encoding="iso-8859-1" /> 15
<apply-templates> Faz chamada recursiva a próximo template (se não tiver argumentos) ou indicado em atributo select <xsl:template match="elemento"> Item 1: <xsl:apply-templates select="filho1"/> Item 2: <xsl:apply-templates select="filho2"/> </xsl:template> <xsl:template match="filho1"> [<xsl:apply-templates />] </xsl:template> <xsl:template match="filho2"> (<xsl:apply-templates />) </xsl:template> 16
1. Processamento da raiz <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> 2. Processamento de todos os elementos <xsl:template match="*"> <xsl:apply-templates /> </xsl:template> 3. Processamento de texto <xsl:template match="text()"> <xsl:value-of select="." /> </xsl:template> Regras nativas 17
Namespace <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> </xsl:stylesheet> 18
XPath Como selecionar um ou mais nós da árvore-fonte? Caminhos (location paths) levam até um nó ou um conjunto de nós através de passos de navegação na árvore de um documento. Padrões de combinação (match patterns) um tipo especial de caminho levam até um nó ou conjunto de nós através de combinação de padrões não permite o uso de eixos ascendentes (..) 19
Expressões XPath Os tipos de expressão são operações sobre nós da árvore-fonte (caminhos) operações sobre texto operações booleanas operações com resultado numérico Cada tipo de expressão devolve um resultado que pode ser um tipo de dados um conjunto de nós (node set) um texto (string) um valor booleano (boolean) um número (number) 20
Caminhos Seqüência de passos até um determinado conjunto de nós (node set) Exemplo: /raiz/elemento/filho/neto../../primo[3] Dois tipos absolutos: começam no nó raiz (iniciam com "/") relativos: começam no nó do contexto (context node) 21
Padrões de combinação São traduzidos em caminhos Usados para combinação Exemplo: <xsl:template match="..."> Resolvidos da direita para a esquerda Não podem conter eixos ascendentes Não pode:../elemento Pode: //elemento ou /ancestral//elemento Devem ser a mais simples expressão que localize o(s) nó(s) desejado(s) 22
Caminhos vs. Padrões A expressão "nome" terá resultados diferentes se a expressão for um caminho ou um padrão Caminho: [contexto atual]/nome Padrão: [quaisquer ancestrais]/nome pessoa pessoas pessoa pessoa Na árvore ao lado, se o nó de contexto for <pessoas> o caminho devolverá um conjunto vazio o padrão devolverá um conjunto de três nós nome Fulano nome Sicrano nome Beltrano 23
Onde usar padrões/caminhos Atributos XSLT match, recebem padrões para instanciar templates: <xsl:template match="autor">... <xsl:template match="livro//pagina[25]">... Atributos XSLT select e test, usados dentro dos templates, recebem caminhos: <xsl:value-of select="../livro/titulo" /> <xsl:for-each select="@numero" >... 24
<if> Bloco condicional Executa se expressão XPath passada retornar true <xsl:if test="/raiz/elemento/filho"> <xsl:value-of select "@atrib_do_filho" /> </xsl:if> <xsl:if test="(5 > 3) and not(9 < 4))">... </xsl:if> <xsl:if test="starts-with(@nome, 'Sra. ')">... </xsl:if> 25
<choose> <when> <otherwise> Condicional tipo case (if-then-else) <xsl:choose> <xsl:when test="../carro[@novo='true']">... </xsl:when> <xsl:when test="../casa">... </xsl:when> <xsl:when test="../salario/text() > 10000">... </xsl:when> <xsl:otherwise>... </xsl:otherwise> </xsl:choose> 26
<sort> Ordenação Aplica-se a cada nó do conjunto de nós do contexto. Use dentro de <apply-templates> <xsl:apply-templates> <xsl:sort select="@codigo" /> <xsl:value-of select="." /> </xsl:apply-templates> 27
Looping com <for-each> Permite processar um conjunto de nós dentro da mesma regra de template (sem usar recursão) <xsl:template match="livro"> <xsl:for-each select="capitulo"> <xsl:value-of select="position()" /> <xsl:text>. </xsl:text> <xsl:value-of select="titulo" /> </xsl:for-each> </xsl:template> 28
<for-each> e <sort> <sort> pode ser usado dentro de <for-each> para ordenar os elementos <xsl:template match="indice"> <xsl:for-each select="assunto"> <xsl:sort select="@codigo_dewey" /> <xsl:value-of select="@codigo_dewey" /> <xsl:text>: </xsl:text> <xsl:value-of select="." /> </xsl:for-each> </xsl:template> 29
XSL Formatting Objects Aplicação XML para descrever o layout preciso de texto e imagens em uma página Elementos representam Regras para formatação de várias páginas Layout de páginas individuais, margens, rodapés Hifenação, alinhamento, fontes, cores, leading imagens, gráficos, tabelas, listas, links Isoladamente, XSL-FO não é folha de estilo É formato final, com estrutura que visa a apresentação (como XHTML) Típicamente, se cria um XSLT que gera FO a partir de uma fonte XML 30
Hello World <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> Ligação entre as regras de layout e o conteúdo afetado Este é o "<head>" do XSL-FO <fo:page-sequence master-name="p1"> <fo:flow flow-name="xsl-region-body"> <fo:block color="blue" font-size="20pt">hello!</fo:block> <fo:flow> </fo:page-sequence> Este é o "<body>" do XSL-FO </fo:root> 31
<root> Raiz do documento XSL-FO Define o namespace http://www.w3.org/1999/xsl/format Uso típico <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format">... </fo:root> Normalmente, documentos FO são gerados com XSLT <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <xsl:apply-templates /> </fo:root> </xsl:template> 32
Estrutura do documento O elemento <root> deve conter Um <layout-master-set> que contém "mestres de layout" definem templates reutilizáveis para layout de páginas cada mestre possui um identificador que é usado para associá-lo a um bloco de conteúdo o tipo de mestre mais simples (e o único atualmente suportado pelos processadores) é <simple-page-master> Pelo menos um <page-sequence>, onde fica o conteúdo define uma seqüência de páginas em um documento cada <page-sequence> deve estar associado a um mestre de layout existente contém objetos <flow> e/ou <static-content> 33
Cabeçalho Cabeçalho mínimo <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <simple-page-master> define margens, altura e largura da página e contém pelo menos uma região master-name do elemento é ID para que elementos de conteúdo <page-sequence> possam referenciá-lo Atributos típicos (ID e dimensões da página) <fo:simple-page-master master-name="p1" margin-top="1.5cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="1.5cm" page-width="21cm" pageheight="29.7cm">... regiões afetadas... </fo:simple-page-master> 34
Regiões Há cinco regiões <region-body /> obrigatória área de conteúdo principal da página define um ID implícito (fixo): xsl-region-body, para uso por elementos de conteúdo de fluxo ou estático. <region-start /> e <region-end /> Em documentos de linguagem ocidental, start é a margem esquerda e end é margem direita. IDs: xsl-region-start e xsl-region-end <region-before /> e <region-after /> before é a margem superior, after é a margem inferior. IDs: xsl-region-before e xsl-region-after. 35
<simple-page-master> Margens e regiões margin-top <region-before /> Margens do <simple-page-master> limitam a área de impressão <region-body> ocupa todo o espaço restante margin-left <region-start /> <region-body /> <region-end /> margin-right Outras regiões opcionais podem ser definidas sobre <region-body> <region-before extent="2cm"/> <region-end extent="1cm"/> Margens de <region-body> devem ser iguais ou maiores que os extent das regiões marginais <region-after /> margin-bottom <region-body margin-left="2.7cm" margin-right="1.2cm" margin-bottom="2.1cm" margin-top="2.2cm" /> 36
XSLT Layout geralmente permanece fixo em folha XSLT+FO <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="p1"> <fo:region-before extent="2cm"/> <fo:region-end extent="1cm"/> <fo:region-after extent="1.9cm"/> <fo:region-start extent="2.5cm"/> <fo:region-body margin-left="2.7cm" margin-right="1.2cm" margin-bottom="2.1cm" margin-top="2.2cm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-name="p1"> <xsl:apply-templates /> </fo:page-sequence> </fo:root> </xsl:template> 37
Conteúdo O conteúdo do documento pode estar Em blocos <flow>, que criam nova página quando o texto preenche o espaço disponível na atual Em blocos <static-content>, que são repetidos em todas as páginas da seqüência. Regiões Cada bloco de conteúdo deve estar associado a uma região existente através do atributo flow-name: <fo:static-content flow-name="xsl-region-start">... <fo:flow flow-name="xsl-region-body">... Blocos Dentro de <flow> ou <static-content>, conteúdo deve estar em blocos: <block>, <list-block>, <table>, etc. 38
Blocos de conteúdo <fo:page-sequence master-name="p1" font-size="8pt"> <fo:static-content flow-name="xsl-region-after"> <fo:block> <fo:leader leader-pattern="rule" leader-length="16cm" /> </fo:block> <fo:block text-align="end">página <fo:page-number/> </fo:block> </fo:block> </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block font-family="serif" font-size="11pt"> Texto que pode atravessar páginas. </fo:block> </fo:flow> </fo:page-sequence> Este bloco de conteúdo estático está associado com region-after Este bloco de conteúdo de fluxo está associado com region-body 39
Blocos Os elementos <flow> e <static-content> devem conter elementos de bloco <block> Bloco de propósito geral <list-block> Bloco que contém itens de lista <table> Bloco que contém tabela Blocos podem ter conteúdo misto, contendo texto e elementos <inline> Trecho de propósito geral <external-graphic> Imagem ou gráfico externo <page-number> Número de página <basic-link> Referência de hipertexto <instream-foreign-object> Código XML embutido (SVG, por exemplo) <leader> Linhas e outros decoradores 40
Propriedades Propriedades de estilo podem ser aplicadas em <flow>, <static-content> e em quaisquer elementos descendentes Propriedades são atributos Maior parte das propriedades são iguais e têm mesma sintaxe que as propriedades do CSS <fo:block font-family="tahoma, sans-serif" font-size="12pt" color="rgb(255, 45, 45)" margin-top="1cm" font-weight="bold" text-align="center"> Uma <fo:inline color="blue">linha</fo:inline> de texto </fo:block> Algumas propriedades CSS são elementos em XSL-FO Alguns seletores CSS são atributos em XSL-FO Suporte às propriedades depende do processador 41
<table> <fo:table> <fo:table-header> <fo:table-cell> <fo:block font-family="tahoma, sans" font-weight="bold">coluna 1</fo:block> </fo:table-cell> <fo:table-cell> <fo:block font-family="tahoma, sans" font-weight="bold">coluna 2</fo:block> </fo:table-cell> </fo:table-header> <fo:table-body> <fo:table-row> <fo:table-cell> <fo:block font-family="monospace">célula 1.1</fo:block> </fo:table-cell> <fo:table-cell> <fo:block font-family="monospace">célula 1.2</fo:block> </fo:table-cell> </fo:table-row>... <fo:table-row>... </fo:table-row> </fo:table-body> </fo:table> 42
<list-block> <fo:list-block> <fo:list-item> <fo:list-item-label> <fo:block font-size="20pt" color="red"> </fo:block> </fo:list-item-label> <fo:list-item-body start-indent="70pt"> <fo:block> Item um </fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item>... </fo:list-item>... </fo:list-block> 43
<external-graphic> Permite incluir uma imagem na página Objeto inline <fo:block> <fo:external-graphic src="moe.gif"/> </fo:block> <fo:block> <fo:external-graphic src="http://www.x.com/moe.gif"/> </fo:block> 44
<basic-link> Vínculo de hipertexto Vincula uma referência de ID a um ID Geralmente, quando o documento é gerado via XSLT, o ID é obtido do elemento ao qual se quer vincular ou via alguma variável Exemplo: <fo:basic-link internal-destination="{@id}" text-decoration="underline" color="blue"> <xsl:value-of select="@codigo"/> </fo:basic-link> 45
<instream-foreign-object> Permite embutir outra linguagem XML na página <fo:instream-foreign-object> <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="300" height="300" viewbox="0 0 300 300"> <svg:circle style="fill: green" r="50" cx="150" cy="150" /> </svg:svg> </fo:instream-foreign-object> 46
Visualização XSL-FO é uma linguagem de descrição de página Páginas podem ser geradas por um programa que construa o documento na memória (como faz o browser com HTML e CSS) ou que gere um arquivo PostScript, PDF: Apache FOP, RenderX XEP, REXP RTF (MS-Word): JFOR, RenderX Visualização em browser: IBM XFC Ferramentas para desenvolver FO HP FOA Para rodar o FOP (arquivo.bat em c:\xml) fop arquivo.fo arquivo.pdf Para rodar o JFOR (arquivo.bat em c:\xml) jfor arquivo.fo arquivo.doc 47
XML: uma introdução prática <xml:sax.dom /> Helder da Rocha www.argonavis.com.br 1
Programação com XML Há duas APIs padrão para manipular (interpretar, gerar, extrair dados e tratar eventos) arquivos XML: Document Object Model (DOM) Simple API for XML (SAX) As duas APIs servem a finalidades diferentes. SAX é mais simples. Oferece métodos que respondem a eventos produzidos durante a leitura do documento Notifica quando um elemento abre, quando fecha, etc. DOM vai além e monta uma estrutura hierárquica de objetos, em forma de árvore, que permite a navegação na estrutura do documento Propriedades dos objetos podem ser manipuladas 2
SAX ou DOM? SAX Gasta menos memória Mais simples menos recursos disponíveis Ideal para aplicações simples que não precisam manipular com toda a árvore de objetos DOM Em grandes documentos e hierarquias profundas exige mais recursos Fornece funções que permitem ter muito controle sobre os dados É a única opção para manipulação no cliente APIs disponíveis em várias linguagens Java, VB, C, JavaScript (apenas DOM) 3
DOM Document Object Model Objetivo: oferecer uma interface de programação uniforme, independente de plataforma e linguagem, para aplicações que manipulam XML OMG IDL Serve para criar um novo documento XML navegar na árvore XML modificar, remover ou adicionar nós (elementos, atributos, texto, comentários, PIs, etc.) 4
SAX Simple API for XML Baseada em eventos Dispara eventos durante processamento do documento eventos podem ser capturados por ouvintes cadastrados ações podem ser tomadas em cada situação Exemplos de eventos inicio e fim do documento início e fim do elemento (pode-se descobrir qual) nó de caractere nó de comentário... 5
SAX vs. DOM Não são concorrentes DOM é ideal para manipular a árvore XML recursivamente SAX é ideal para ler o documento seqüencialmente DOM requer carga de todo o documento: consome mais memória SAX não "lembra" de tarefas realizadas: não serve para validar referências cruzadas Nos processadores Crimson e Xerces, SAX é usada para montar a árvore DOM 6
SAX: operações Se um processador SAX receber o documento... <carta> <mensagem id="1">bom dia!</mensagem> </carta>... ele irá disparar a seguinte seqüência de eventos: startdocument() startelement("carta", []) startelement("mensagem", [Attribute("id","1")]) characters("bom dia!") endelement("mensagem") endelement("carta") enddocument() Programador deve implementar um objeto "ouvinte" para capturar os eventos e extrair as informações desejadas 7
SAX: exemplo em Java (trecho) public void characters(char[] ch, int start, int length) { for (int i = start; i < length; i++) { System.out.println(ch[i]); } } public void startelement(string uri, String localname, String qname, Attributes att) { System.out.print("<" + qname); for (int i = 0; i < att.getlength(); i++) { System.out.print(" " + att.getqname(i) + "='" + att.getvalue(i) + "'"); } System.out.println(">"); } public void endelement(string uri, String localname, String qname) { System.out.println("</" + qname + ">"); } 8
DOM: operações Leitura Passo 1: carregar o documento e identificar os tokens Passo 2: identificar elementos e outros nós (pode usar SAX) Passo 3: montar a árvore (pode ser feito durante o passo 2) Alteração Localiza o nó de referência Remove, altera, muda posição, cria nó antes ou depois. Criação Cria raiz; cria elemento raiz; cria elementos filho e atributos; cria nós de texto Monta árvore: coloca atributos em elementos, coloca nós de texto em elementos, coloca elementos filho em elementos pai, coloca elemento raiz na raiz 9
DOM: tipos de dados Coleções: NodeList, NamedNodeMap Raiz da hierarquia de nós: Node. Subclasses: Attr (atributo) CharacterData (classe abstrata) Text (nó de texto) CDATASection (seção CDATA) Comment (comentário) Document (documento inteiro) DocumentFragment (sub-árvore) DocumentType <!DOCTYPE> Element (elemento) Entity (valor da entidade - conteúdo) EntityReference (nome da variável) Notation (valor de uma notação) ProcessingInstruction (instrução de processamento) 10
DOM: Hierarquia Node DocumentFragment Document Text CDATASection CharacterData Attr Comment Element DocumentType NodeList Notation NamedNodeMap Entity EntityReference ProcessingInstruction 11
DOM: navegação DOM usa constantes para identificar tipos de nó (nodetype) Constante (opcional) Tipo valor ELEMENT_NODE Element 1 ATTRIBUTE_NODE Attr 2 TEXT_NODE Text 3 CDATA_SECTION_NODE CDATASection 4 ENTITY_REFERENCE_NODE EntityReference 5 ENTITY_NODE Entity 6 PROCESSING_INSTRUCTION_NODE ProcessingInstruction 7 COMMENT_NODE Comment 8 DOCUMENT_NODE Document 9 DOCUMENT_TYPE_NODE DocumentType 10 DOCUMENT_FRAGMENT_NODE DocumentFragment 11 NOTATION_NODE Notation 12 12
Para usar DOM É preciso obter uma instância do documento (forma de fazer isto depende de processador) Internet Explorer Netscape Xerces JAXP JDOM IBM Parser MSXML IE (data island): <xml id="xdoc"></xml> Código pode manipular referência xdoc e obter raiz xdoc.async = false; // desabilita threads xdoc.load("arquivo.xml"); document = xdoc; // Este é o elemento raiz ou var xdoc = new ActiveXObject("Microsoft.XMLDOM"); xdoc.load("arquivo.xml") Java JAXP Criar uma instância a patir de DocumentBuilderFactory 13
Ilhas de dados XML (só MSXML) Elemento HTML (Internet Explorer) que possibilita a integração HTML-XML Permite embutir em uma página HTML (gerada ou não dinamicamente) um arquivo XML Arquivo pode ainda ser transformado por XSLT no momento da inclusão e receber formatação CSS Sintaxe: <xml id="identificador">... código XML.. </xml> O identificador é necessário para possibilitar a manipulação dos dados na página O arquivo também pode ser importado <xml id="identificador" href="arquivo.xml"></xml> 14
Ilhas de dados (exemplo) (1) Pode-se inserir XML em HTML da seguinte forma <xml id="note"> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note> </xml> Ou importando de um arquivo externo <xml id="note" src="note.xml"> </xml> Fonte: www.xml101.com 15
Ilhas de dados (2) - só MSXML Dados em XML podem ser vinculados a valores em tabelas, por exemplo, ou manipulados via JavaScript/VBScript <html> <body> <xml id="cdcat" src="cd_catalog.xml"></xml> <table border="1" datasrc="#cdcat"> <tr> <td><span datafld="artist"></span></td> <td><span datafld="title"></span></td> </tr> </table> </body> </html> Fonte: www.xml101.com <?xml version="1.0"?> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> </CD> <CD> <TITLE>Hide your heart</title> <ARTIST>Bonnie Tyler</ARTIST> </CD> </CATALOG> cd_catalog.xml 16