【问题标题】:JavaScript XML ParsingJavaScript XML 解析
【发布时间】:2011-01-16 22:07:39
【问题描述】:

有没有办法在 JavaScript 中循环遍历 XML 节点的直接子节点,而不使用 jquery 或类似的库?我尝试使用“.childNodes”,但由于某种原因它不能正常工作。 “.childNodes.length”返回一个通常大于直接节点数的数字,并且所有标签名称(使用 .tagName)由于某种原因未定义。我知道我的 XML 数据格式正确,因为如果我使用直系子项的标签调用“.getElementsByTagName()”,它就可以正常工作。 我的困境的一些例子:

var root = xmlData.getElementsByTagName("library_geometries")[0]; 

for (i = 0; i < root.childNodes.length; i++) //get all the geometries
{  
 geom =  root.childNodes[i];  
 alert(geom.tagName);
}

------------------------------------------------------
geom = root.getElementsByTagName("geometry");

for (i = 0; i < geom.length; i++) //get all the geometries
{  
 alert(geom[i].tagName);
}

第一个根本不起作用,第二个在这个例子中起作用。

【问题讨论】:

  • 如果发生在我身上,我想先检查“nodeType”属性。可能混入了 CDATA(文本)节点?
  • 哦,这也不是关于解析 XML,因为如果你正在遍历 DOM,某些东西已经解析了它(大概是浏览器)。
  • 完全同意@Pointy.. 改用JS xml 解析器? (即莎丽莎...dev.abiss.gr/sarissa
  • 嗯...我确实检查了每个孩子的 nodeType,由于某种奇怪的原因,它在 1 和 3 之间变化。奇怪,因为我只有根节点内的标签,因此它应该只有元素节点而不是文本节点。
  • XML 规范 requires 空白被保留为文本节点。这些包括制表符、换行符和空格。您可能会看到这个问题,因为您的 XML 是为人类消费而格式化的。如果您删除所有不必要的空格,那么所有这些 type3 节点都将消失。有趣的是,IE 是唯一没有这个问题的浏览器,因为它不关心违反规范。我个人认为规范是愚蠢的。

标签: javascript xml parsing


【解决方案1】:

这实际上是对 Hemlock 答案的澄清。我把它放在这里而不是评论他的答案,因为我没有空间在 cmets 中绘制漂亮的 ASCII 艺术。

假设我们有以下 XML:

<a><b></b><c></c></a>

这会生成以下 DOM:

<a>--.
     |
    <b>
     |
    <c>

这通常是您所期望的。

假设我们现在有以下 XML:

<a>
   <b></b>
   <c></c>
</a>

您会认为这会生成相同的 DOM。但是按照标准,你就错了。相反,标准要求它生成以下 DOM:

<a>--.
     |
    "\n   "
     |
    <b>
     |
    "\n   "
     |
    <c>
     |
    "\n"

是的,规范说所有这些空白都应该在 DOM 中捕获。几乎所有的 XML 实现都这样做(不仅在浏览器中)。唯一的例外是 IE(以及 JScript 中的 XML 引擎的扩展),因为 Microsoft 不太关心违反标准。

就个人而言,这在 99.999% 的情况下都是无用的。大约只有在您尝试实现 XML 代码编辑器时这才有用。但它在标准中,因此如果浏览器想要符合标准,就需要实现它。

【讨论】:

  • 我对这个结果的看法很复杂。
【解决方案2】:

您将文本节点 (nodeType == 3) 与元素混合在一起。文本节点可能只包含空格。您只想过滤 nodeType 上的循环(如 Pointy 所说)。

var root = xmlData.getElementsByTagName("library_geometries")[0]; 

for (i = 0; i < root.childNodes.length; i++) //get all the geometries
{  
 geom =  root.childNodes[i];  
 if (geom.nodeType == 1) {
  alert(geom.tagName);
 }
}

https://developer.mozilla.org/en/nodeType

【讨论】:

    【解决方案3】:

    等待 html 文档被解析。你应该在文档准备好时运行这段脚本,在 onload() 中,文档还没有被解析,所以你可能找不到标签。

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 2012-08-01
      • 1970-01-01
      • 2010-11-05
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多