2010-05-08 107 views
0

出于某种原因的DOMParser是增加每个新行\n一些额外的#text元素此URL火狐的DOMParser问题

http://rt.com/Root.rss

...以及其他许多RSS我试过。我检查了cnn/bbc提要,他们没有换行符和dom解析器很好地处理它们。所以,我必须分析它

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

服务器返回的文本/ XML之前添加以下内容。

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

该返回\n没有我上面的代码和channel与修正。

回答

0

你的问题是什么?您是否希望不是使用解决方法?我认为解析器按预期工作时,解决方法是必要的。

+0

我的想法是解析器不工作如预期该解决方法有点人为。解析器不应该放置'\ n'元素,所以我可能会滥用解析器的功能。真的想要避免这种解决方法。 – Pablo 2010-05-08 06:52:43

4

是的,这就是XML解析器默认应该执行的操作。习惯在子节点上行走,检查它们是否是元素(nodeType===1)或文本节点(3)。

从Firefox 3.5开始,你会得到Element Traversal API,给你诸如firstElementChildnextElementSibling的房产。这使得遍历DOM,而忽略空白更容易。或者,您可以使用XPath(doc.evaluate)查找您想要的元素。

如果你想删除空白节点为好,这是一个更好的主意,通过使用正则表达式的黑客做的解析DOM比:

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也具有.children属性,它是所有元素子元素的集合。 – Dormilich 2010-05-12 17:47:11

+0

可以分别使用'Node.TEXT_NODE'和'Node.ELEMENT_NODE'来代替'3'和'1'。 – Westy92 2014-08-21 21:12:26

+1

@ Westy92:您可能无法使用,具体取决于您需要与哪些版本的IE兼容。 – bobince 2014-08-24 22:08:38