• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jreis

Verificar se variavel existe - carregada de um XML

7 mensagens neste tópico

Boas,

Tenho o seguinte problema, estou a tentar retirar variaveis (mais precisamente nodes) de um documento XML, usando o seguinte método:

o XML é carregado a partir do objecto responseXML de um XMLHTTPRequest, desta forma:

xmlDoc = pedido.responseXML.documentElement;

o XML é qualquer coisa deste género:

<?xml version="1.0" encoding="UTF-8"?>
<pessoa>
<nome>Ze Ninguem</nome>
<morada>Rua de nenhures</morada>
<tel></tel>
...
</pessoa>

até aqui tudo muito bem, funciona 5 estrelas, o XML é válido, não tem qualquer problema. Depois, para aceder aos nodes, usando isto:

var nome = xmlDoc.getElementsByTagName("nome")[0].firstChild.nodeValue;

também funciona sem problema nenhuma, a variável é atribuida o valor correcto.

O meu problema surge se tentar aceder um node que não tenha valor, por exemplo o <tel> no exemplo dado.

O que se passa é que basicamente não se passa nada, o script para por completo, sem nenhuma mensagem de erro, nada. Isto acontece em (pelo menos) Opera 9.10, IE6 e Firefox 1.5.0.9.

Qualquer tentativa de acesso a um node vazio resulta nisto, portanto torna-se impossível verificar se está em branco, se é igual a null, se está undefined...

O que queria saber é se existe uma forma de verificar isso, ou se alternativamente existir outra forma de aceder ao XML..? Não queria  usar atributos, porque isso é uma miséria de se trabalhar em javascript...

Neste momento desenrasquei-me a nível do servidor (o XML é dinâmico, gerado por PHP), sempre que houver um valor vazio ele mete lá a string "undefined", assim no javascript é só verificar se o valor é igual a esse e funciona tudo bem, mas obviamente não queria manter esse método...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm... Posso experimentar isso... Lembrei-me agora,se isso não resolver vou tentar omitir por completo o elemento se ele não tiver valor, pode ser que já dê para verificar a existência de um node em vez do valor...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, depois fazes um getElementbyName() ou something. if(xmlDoc.getElementbyName("tel")){ siga }else{ nem por isso }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não tive tempo de experimentar isto, mas não tá esquecido! Queria mesmo ver se resolvia isto...!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não recomendaria usar o metodo getElementbyName() para buscar valores em XML. Eu usaria XPath.

Mas vamos lá descrever o que estás a fazer:

var tel = xmlDoc.getElementsByTagName("tel")[0].firstChild.nodeValue;

xmlDoc.getElementsByTagName("tel")

-> vai buscar TODAS as tags com o nome igual a "tel"

[0]

-> retornar o index 0

.firstChild

-> aqui está o teu problema. Com isto estás a tentar aceder ao node do tipo text. No caso de ser <tel></tel> ou mesmo <tel /> não existe!!

Ou mantendo o uso da função getElementbyName() e fazendo:

var tel = null;
var node xmlDoc.getElementsByTagName("tel")[0];
if (node != null && node.firstChild != null)
    tel = node.firstChild.nodeValue;

Um exemplo de uso de XPath e mais cross-browser seria:

var tel = null;
var node = null;
var xpath = "/pessoa/tel";

if (xmlDoc.selectSingleNode) // IE
    node = xmlDoc.selectSingleNode(xpath);
else if (xmlDoc.evaluate) // gecko
    xmlDoc.evaluate(xpath,  xmlDoc, null, 0, null);

if (node == null)
    tel = (node.value != null) ? node.value : (node.text != null) ? node.text : node.textContent;

Acho o XPath muito mais poderoso dado que dá até para sacares atributos. Por exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<pessoa>
<nome>Ze Ninguem</nome>
<morada>Rua de nenhures</morada>
<tel indicativo="+351">212220011</tel>
...
</pessoa>

a expressão XPath para ir buscar o indicativo seria "/pessoa/tel/@indicativo"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm... Ainda não tive tempo de rever a coisa (até porque tá a funcionar, mal e porcamente, mas tá), mas vou ter isso em conta...! Obrigado pela dica..!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora