2010-05-08 7 views
0

Pour une raison DOMParser est d'ajouter quelques éléments de #text supplémentaires pour chaque nouvelle ligne \n pour cette urlproblème Firefox DOMParser

http://rt.com/Root.rss

... ainsi que beaucoup d'autres RSS j'ai essayé. J'ai vérifié les flux cnn/bbc, ils n'ont pas de nouvelle ligne et dom parser les gère bien. Donc, je dois ajouter ce qui suit avant de l'analyser

var xmlText = htmlText.replace(/\n[ ]*/g, ""); 
var xmlDoc = parser.parseFromString(xmlText, "text/xml"); 

Le serveur renvoie text/xml.

var channel = xmlDoc.documentElement.childNodes[0]; 

ce retour \n sans mon code ci-dessus et channel avec correction.

Répondre

0

Quelle est votre question? Voulez-vous pas utiliser la solution de contournement? Je pense que la solution de contournement est nécessaire car l'analyseur fonctionne comme prévu.

+0

Mes pensées sont l'analyseur ne fonctionne pas comme prévu et la solution de contournement est quelque peu artificielle. L'analyseur ne doit pas mettre d'éléments '\ n', donc je pense que je fais peut-être un mauvais usage de la fonctionnalité de l'analyseur. Vraiment envie d'éviter de telles solutions. – Pablo

4

Oui, c'est ce que les analyseurs XML sont supposés faire par défaut. Familiarisez-vous avec les nœuds enfants pour vérifier s'ils sont des éléments (nodeType===1) ou des nœuds de texte (3). De Firefox 3.5, vous obtenez le Element Traversal API, vous donnant des propriétés comme firstElementChild et nextElementSibling de Firefox 3.5. Cela rend la marche sur le DOM tout en ignorant les espaces plus faciles. Sinon, vous pouvez utiliser XPath (doc.evaluate) pour trouver les éléments que vous voulez.

Si vous souhaitez supprimer des nœuds blancs pour de bon, il est une bien meilleure idée de le faire sur le DOM analysable qu'en utilisant un hack regex:

function removeWhitespace(node) { 
    for (var i= node.childNodes.length; i-->0;) { 
     var child= node.childNodes[i]; 
     if (child.nodeType===3 && child.data.match(/^\s*$/)) 
      node.removeChild(child); 
     if (child.nodeType===1) 
      removeWhitespace(child); 
    } 
} 
+0

Firefox a également la propriété .children, qui est une collection de tous les éléments enfants. – Dormilich

+0

Au lieu de '3' et '1', vous pouvez utiliser 'Node.TEXT_NODE' et 'Node.ELEMENT_NODE', respectivement. – Westy92

+1

@ Westy92: vous ne pourrez peut-être pas, selon les versions d'IE avec lesquelles vous devez être compatible. – bobince