2009-09-23 4 views
2
//create an instance of the XML parser 
if (window.ActiveXObject) 
{ 
    //Checking if the browser is IE 
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async="false"; //make sure doc is fully loaded 
    xmlDoc.load(strPath) //load the file in the parser 
    if (xmlDoc.parseError.errorCode != 0) 
    { 
     alert("Error #: " + xmlDoc.parseError.errorCode;   
    }   
} 

//for mozilla based browsers 
else if (document.implementation && document.implementation.createDocument)  
{ 
    xmlDoc= document.implementation.createDocument("","doc",null); 
    xmlDoc.async=false; //make sure doc is fully loaded 
    loaded = xmlDoc.load(strPath); 
    if(!loaded) 
    { 
     alert("Error in XML File"); 
    }    
} 

//Parse the XML 
var root = xmlDoc.documentElement; 
level1Nodes = root.children; 
for(var index1 = 0; index1 < level1Nodes.length; index1++) 
{ 
    //Extract the markup content from XML 
    var level1Node = level1Nodes[index1]; 
    var strName = level1Node.children[0].textContent; 
    var strHeader1 = level1Node.children[1].tagName; 
    var strHeader1Content = level1Node.children[1].textContent; 
} 

Des idées? La propriété "children" est-elle disponible dans IE Parser DOM?Pourquoi ce code DOM Javascript fonctionne-t-il uniquement en FF, mais pas IE?

Merci d'avance pour toute votre aide!

Répondre

7

Dans IE, un document XML n'implémente pas le même modèle d'objet de document qu'un document HTML; en particulier, les objets XML Node ne possèdent pas la propriété children, ce qui est non standard. Vous devez utiliser la collection childNodes à la place. Cependant, sachez que dans Firefox et d'autres navigateurs - et, IIRC, dans des circonstances très spécifiques dans IE - cette collection inclura également des nœuds de texte qui contiennent uniquement des espaces, tels que des sauts de ligne dans le fichier XML d'origine. Donc, vous aurez besoin de vérifier la propriété nodeType: si elle a la valeur 1, il s'agit d'un élément, et aura comme propriétés tagName.

En outre, comme MSXML implémente DOM Level 1, alors que Firefox implémente DOM Level 3, vous ne pourrez pas utiliser la propriété textContent, qui a été introduit dans le niveau 3. Au lieu de cela, vous devrez parcourir la childNodes de nodeType === 3 et concaténer leurs propriétés nodeValue, et probablement ensuite vouloir couper tout espace de début ou de fin. Sinon, si vous savez qu'il n'y aura plus que des textNodes, appelez d'abord la méthode normalize de l'élément pour vous assurer qu'il ne contient qu'un seul noeud de texte.

Personne n'a jamais dit ce genre de choses était censé être facile :-(

+0

wow, merci pour le casser vers le bas pour moi! – BeachRunnerFred

1

children est un objet dans IE6. Peut-être y a-t-il une incohérence dans le fait que le premier enfant d'IE est un nœud de texte, alors que dans d'autres navigateurs, le premier enfant est un nœud d'élément DOM? Habituellement, vous utiliseriez .childNodes et .childNodes.length et vérifiez .nodeType==1 dans une boucle pour parcourir les enfants.

+0

merci, je vais vous donner que l'essayer. – BeachRunnerFred

Questions connexes