| 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