Adobe User Group

Estudo de XML – Parte 1

Data de publicação: 06-04-2005

Visitas: 3288

hugo

Colunistas desde: 2007

Matérias publicadas: 18

“http://www.w3.org/TR/html4/loose.dtd”>
<!– .meuCode { font:”Courier New”, Courier, mono; font-size: 11px; color:#3333CC; } –>

Fala galera!

Estamos aeh mais uma vez, agora com um artigo muito jóia sobre XML.
Caso você tenha dúvidas de como é a sintaxe do XML, eu recomendo você procurar ajuda direto na fonte: o site da W3C possui um rico material para você poder estudar, além de orientar ao usuário a iniciar e prosseguir no caminho correto.

Utilizaremos nessa série de artigos, a classe XML.
Vamos fazer esse estudo em três partes:

  • Métodos de utilização para leitura de nós (nodes);
  • Métodos de criação de XML no Flash;
  • Salvando arquivos XML com PHP;

Bom, vamos começar!

Métodos de utilização para leitura de nós (nodes);

A classe XML do Flash, nos oferece um controle muito amplo sobre nossos arquivos XML. Para a coluna não ficar um linguição de grande (hehehe), resolvi dividir essa série em 3 partes, como dito anteriormente.
Segue o nosso cronograma para estudo nessa primeira etapa:

  • Instanciando um novo objeto XML;
  • XML.firstChild;
  • XML.lastChild;
  • XML.hasChildNodes;
  • XML.childNodes;
  • XML.nodeType;
  • XML.nodeName;
  • XML.nodeValue;
  • XML.attributes;
  • XML.load;
  • XML.loaded;
  • XML.onLoad;
  • XML.ignoreWhite;
  • XML.getBytesLoaded;
  • XML.getBytesTotal;
  • XML.nextSibling;
  • XML.previousSibling;
  • XML.parentNode;
  • XML.send;
  • XML.sendAndLoad;
  • XML.status;

Bom vamos ao trabalho!

Instanciando um novo objeto XML
Para podermos trabalhar o nosso arquivo XML no Flash, é necessário criarmos um objeto da classe XML. Para isso, podemos utilizar a sintaxe (ps: quando o parâmetro estiver entre colchetes, siginifica que ele é opcional):
var doc:XML = new XML( [document:String] );

Caso você tenha já o conteúdo do XML, você pode iniciar o objeto com ele, ou iniciar um novo objeto sem nada, para poder carregar o arquivo posteriormente. Vejamos o primeiro exemplo:
var conteudo:String = “<login><username>hugo</username><password>teste</password></login>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.nodeName); // irá mostrar login

Se o conteúdo do arquivo estiver correto, ou seja, sem erros de sintaxe, codificação etc, o processo acima irá funcionar.
Mais adiante iremos ver como identificar erros na sintaxe XML.
Para iniciar um objeto novo, sem nenhum conteúdo, basta iniciar da maneira abaixo:
var doc:XML = new XML();

XML.firstChild : XMLNode
Leva o analisador XML do Flash para o primeiro nó filho da lista de nós atual. Por exemplo:
var conteudo:String = “<login>”+ // primeiro nó, pai de todos
“<conta>”+ // segundo nó, pai de usuario e senha e primeiro filho de login
“<usuario>hugo</usuario>”+ // primeiro filho de conta
“<senha>teste</senha>”+ // segundo filho de conta
“</conta>”+
“</login>”;
var doc:XML = new XML(conteudo);

// Quando usarmos doc.firstChild, iremos para login
// Quando usarmos doc.firstChild.firstChild, iremos para conta
// Quando usarmos doc.firstChild.firstChild.firstChild, iremos para usuario
trace(doc.firstChild.firstChild.firstChild)

Ou seja nossa lista está assim:
1 – Login

2 – Conta
3.1 – Usuário
3.2 – Senha

Login é o principal, logo, filho inicial do documento XML;
Conta é o primeiro filho de Login;
Usuário e Senha são filhos de Conta;
Usuário
é o primeiro filho de Conta;

Depois desta análise, concluimos que para se chegar a usuário, entramos no primeiro filho do arquivo (doc.firstChild), em seguida, entramos no primeiro filho de login que é conta (doc.firstChild.firstChild) e finalmente, entramos dentro do nó de usuário, que é o primeiro filho de conta (doc.firstChild.firstChild.firstChild).

XML.lastChild : XMLNode
Funciona de forma semelhante ao XML.firstChild, porém ao invés de levar o analisador para o primeiro nó filho da lista de nós atual, leva para o último. Utilizando o exemplo citado em XML.firstChild, vamos tentar pegar agora a senha do usuário. Para isso, basta nós trocarmos a última linha pela mostrada abaixo:

trace(doc.firstChild.firstChild.lastChild)

Por que? Simples: entramos no primeiro filho do arquivo (doc.firstChild), em seguida, entramos no primeiro filho de login que é conta (doc.firstChild.firstChild) e finalmente, entramos dentro do nó de senha, que é o segundo e último filho de conta (doc.firstChild.firstChild.lastChild).

XML.hasChildNodes() : Boolean
Checa se o nó atual possui filhos ou não. Em caso de sucesso (possui filhos), retorna true, do contrário (não possui filhos) retorna false.
Exemplo:
var conteudo:String = “<login><conta usuario=\”hugo\” senha=\”teste\” /></login>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.hasChildNodes()); // mostará true

XML.childNodes : Array
Propriedade de somente leitura. Retorna um array do filho do objeto XML especificado. Cada elemento dentro da matriz é uma referência ao objeto XML que representa o nó filho.
Exemplo:
var conteudo:String = “<usuario>hugo</usuario>”+ // primeiro nó, indice 0
“<senha>teste</senha>”+ // segundo nó, indice 1
“<level>3</level>”; // terceiro nó, indice 2

var doc:XML = new XML(conteudo);
trace(doc.childNodes[2]);
// irá mostrar <level>3</level>

Caso você tenha nós aninhados (um dentro do outro), você poderá usar como no exemplo abaixo:
var conteudo:String = “<conta>” + // primeiro nó, pai de todos e indice 0
“<usuario>hugo</usuario>” + // primeiro nó dentro de conta, indice 0
“<senha>teste</senha>” + // segundo nó dentro de conta, indice 1
“<level>3</level>” + // terceiro nó dentro de conta, indice 2
“</conta>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.childNodes[1]); // mostrará <senha>teste</senha>

XML.nodeType : Number
Utilizando a propriedade nodeType, você pode recuperar o tipo de nó atual para poder fazer o tratamento adequado. O valor desta propriedade é um número que representa o tipo de nó. A numeração dos tipos de nó é feita de conformidade com a recomendação W3C DOM Level 1. Abaixo uma lista com os valores

Valor inteiro

Constante definida

1 ELEMENT_NODE
2 ATTRIBUTE_NODE
3 TEXT_NODE
4 CDATA_SECTION_NODE
5 ENTITY_REFERENCE_NODE
6 ENTITY_NODE
7 PROCESSING_INSTRUCTION_NODE
8 COMMENT_NODE
9 DOCUMENT_NODE
10 DOCUMENT_TYPE_NODE
11 DOCUMENT_FRAGMENT_NODE
12 NOTATION_NODE
Tabela retirada do Help do Flash

Na classe XML do Flash, os únicos tipos suportados são 1 ( ELEMENT_NODE ) e 3 ( TEXT_NODE ).
Exemplo:
var conteudo:String = “<ola>mundo</ola>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.nodeType); // mostrará 1
trace(doc.firstChild.firstChild.nodeType); // mostrará 3

XML.nodeName : String
Retorna o nome do nó atual. Se o tipo de nó atual for 1, retorna o nome do nó. Se for do tipo 3, retorna null.
Exemplo:
var conteudo:String = “<conta><usuario>hugo</usuario><senha>teste</senha></conta>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.nodeName); // irá mostrar conta
trace(doc.firstChild.firstChild.firstChild.nodeName); // irá mostrar null

XML.nodeValue : String
Retorna o valor do nó atual. Se o nó for do tipo 3 ( TEXT_NODE ), retorna o text do nó. Se for do tipo 1 ( ELEMENT_NODE ) retorna null.
Exemplo:
var conteudo:String = “<conta><usuario>hugo</usuario><senha>teste</senha></conta>”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.nodeValue); // irá mostrar null
trace(doc.firstChild.firstChild.firstChild.nodeValue); // irá mostrar hugo

XML.attributes : array
Retorna uma matriz associativa que contém todos os atributos do nó XML referenciado. Uma matriz associativa utiliza strings ao invés de números como chaves da matriz. Exemplo:
var conteudo:String = “<conta usuario=\”hugo\” senha=\”teste\” level=\”3\” />”;
var doc:XML = new XML(conteudo);
trace(doc.firstChild.attributes.usuario); // irá mostrar hugo
trace(doc.firstChild.attributes.senha); // irá mostrar teste

XML.load ( arquivo ) : Void
Carrega um arquivo XML externo e substitui o conteúdo do objeto XML pelo conteúdo do arquivo.
Exemplo:
var doc:XML = new XML();
doc.onLoad = function(success) {
trace(doc); // irá mostrar todo o conteúdo do arquivo XML
}
doc.load ( “teste.xml” );

XML.loaded : Boolean
Indica se o arquivo foi totalmente carregado. Seu valor padrão é true. Quando o método XML.load é chamado, é alterado para false. Quando o carregamento do arquivo termina, seu valor é alterado para true. Exemplo:
var doc:XML = new XML();
trace(doc.loaded); // irá mostrar true
doc.onLoad = function (success) {
trace(doc.loaded); // irá mostrar true
}
doc.load ( “teste.xml” );
trace(doc.loaded); // irá mostrar false

XML.onLoad (success:Boolean)
Evento disparado quando o arquivo termina de ser carregado dentro do objeto XML. Se arquivo for carregado, a variável success terá o valor true. Se o arquivo não for carregado, não existir ou houver erro na comunicação com o servidor, seu valor será false. Exemplo:
var doc:XML = new XML();

doc.onLoad = function (success) {
trace(success); // irá mostrar o valor de success
}
doc.load ( “teste.xml” );

XML.ignoreWhite : Boolean
Seu valor padrão é false. Quando é alterado para true, nós do tipo texto ( TEXT_NODE ) que contém somente espaços em branco são descartados. Exemplo:
// arquivo teste.xml
<teste><item1> texto </item1><item2> </item2></teste>

// Flash
var doc:XML = new XML();
doc.ignoreWhite = true;
doc.onLoad = function (success) {
if(success == true) {
trace(doc);
}
}
doc.load( “teste.xml” );

// irá mostrar<teste><item1> texto </item1><item2 /> </teste>

XML.getBytesLoaded () : Number
Retorna o tamanho, em bytes, carregado do arquivo XML, depois de chamar a função XML.load.

XML.getBytesTotal() : Number
Retorna o tamanho total, em bytes, do arquivo XML.

XML.nextSibling : XMLNode
Um objeto XMLNode que faz referência ao próximo nó XML na lista atual. Se não houverem mais itens, retorna null.
Abaixo um exemplo de seu uso:
var conteudo:String = “<usuario>hugo</usuario>”+
“<senha>teste</senha>”;

var doc:XML = new XML(conteudo);
for (var aNode:XMLNode = doc.firstChild; aNode != null; aNode = aNode.nextSibling) {
trace(aNode);
}

XML.previousSibling : XMLNode
Um objeto XMLNode que faz referência ao nó XML anterior na lista atual. Se não houverem mais itens, retorna null.
Abaixo um exemplo de seu uso:
var conteudo:String = “<usuario>hugo</usuario>”+
“<senha>teste</senha>”;

var doc:XML = new XML(conteudo);
for (var aNode:XMLNode = doc.lastChild; aNode != null; aNode = aNode.previousSibling) {
trace(aNode);
}

XML.parendNode : XMLNode
Move para o nó anterior ao nó ativo ou null se não houver. Por exemplo:
var doc:XML = new XML(”<conta><user>hugo</user><pass>teste</pass></conta>”);
var rootNode:XMLNode = doc.firstChild;
var userNode:XMLNode = rootNode.firstChild;
trace(”O nó anterior de ” + userNode.nodeName + ” é ” + userNode.parentNode.nodeName);
// será exibido: O nó anterior de user é conta

XML.send ( url:String [, window:String]) : Void
Codifica o conteúdo do objeto XML e envia para o endereço informado no parâmetro url, abrindo o resultado na janela od browser indicada no parâmetro window. Se o parâmetro window for omitido, é aberto na mesma janela. O método XML.send quando é utilizado no browser, usa o método POST para enviar os dados. Dentro do ambiente de editoração do Flash, é utilizado o método GET.
var conteudo:String = “<conta><usuario>hugo</usuario><senha>teste</senha></conta>”;
var doc:XML = new XML(conteudo);
doc.send(”http://www.teste.com.br/login.php”, “_blank”);

XML.sendAndLoad ( url:String, targetXMLobject:XML) : Void
Codifica o conteúdo do objeto XML e envia para o endereço informado no parâmetro url usando o método POST, carregando o conteúdo recebido como resposta a chamada dentro do objeto passado como parâmetro em targetXMLobject. Todo o conteúdo dentro de targetXMLobject será substituído pelo conteúdo recebido como resposta. A resposta de carregamento do arquivo XML e seu tratamento funcionam da mesma maneira da XML.load. Se a versão do Flash Player for mais igual ou maior que a 7, a url do arquivo deve estar no mesmo domínio que o seu SWF. Por exemplo: se o SWF estiver em www.teste.com.br, ele não pode carregar arquivos do loja.teste.com.br. Ele pode somente carregar se estiver dentro do mesmo domínio (www.teste.com.br).
var conteudo:String = “<conta><usuario>hugo</usuario><senha>teste</senha></conta>”;
var login:XML = new XML(conteudo);
var responseLogin:XML = new XML();
responseLogin.onLoad = function(success) {
trace(responseLogin);
}

login.sendAndLoad(”http://www.teste.com.br/login.php”, responseLogin);

XML.status : Number
Automaticamente altera e retorna um valor indicando se o documento XML foi analisado dentro de um objeto XML. Os códigos de status são:

  • 0 Sem erros; a análise foi completada com sucesso.
  • -2 Uma seção CDATA não foi terminada corretamente.
  • -3 A declaração XML não foi corretamente terminada.
  • -4 A declaração DOCTYPE não foi corretamente terminada.
  • -5 Um comentário não foi corretamente terminado.
  • -6 Má formação de um elemento XML.
  • -7 Memória insuficiente.
  • -8 Um atributo não foi corretamente terminado.
  • -9 Um início de tag não é compatível com o seu final de tag (Ex: <oi> </primo>).
  • -10 Foi encontrado um final de tag sem o seu início de tag (Ex: <oi> </teste> </oi>).

Exemplo:
var doc:XML = new XML(”<conta><usuario>hugo</usuario><senha>teste</senha></conta>”);
trace(doc.status); // retornará 0

Bom galera, por hoje é só. No próximo artigo veremos como manipular/criar XML dentro do Flash.
Um exemplo de como trabalhar com XML, você confere em http://forum.mxstudio.com.br/index.php?showtopic=10659

@braços e fiquem com Deus!

Divulgue

Adicionar artigo ao Rec6 Adicionar artigo ao Linkk Adicionar artigo ao doMelhor Adicionar artigo ao Eu Curti Adicionar artigo ao del.icio.us

3 usuário comentou em " Estudo de XML – Parte 1 "

Assine o Feed de Comtentários ou URL de Trackback

  Flash + XML by ADNZ Design disse,
Enviado em 27-04-2008 às 11:16 pm

[...] MXStudio: Estudo de XML – Parte 1 [...]

Musicas disse,
Enviado em 09-12-2008 às 8:08 am

Muito bom, estava procurando um tutorial que fala sobre “Como trabalhar com XML no Flash “, e essa dica me foi muito util….

lampiao_muléstia disse,
Enviado em 10-12-2008 às 12:56 pm

Ótimo

Deixe o seu comentário abaixo...

 Username (*required)

 Email Address (*private)

 Website (*optional)

 

MXStudio © 2003-2009. Todos os direitos reservados.
É expressamente proibido a cópia, reprodução e difusão dos textos, fotos e outros elementos contidos neste site sem autorização expressa do MXStudio.