Javascript/XML - 获取节点名称

bog*_*jov 3 javascript xml parsing dom

我需要获取标签"myChild"和"内容"的名称.这很简单,但我陷入困境,困了,这就是我的测试结果:

XML:

...
<myParent>
  <myChild>content</myChild>
</myParent>
<myParent>
  <myChild>content</myChild>
</myParent>
...
Run Code Online (Sandbox Code Playgroud)

JS:

var x=xmlDoc.getElementsByTagName("myParent");
alert(x[1].childNodes[0].nodeName); //returns "#text" - "myChild" needed
alert(x[1].childNodes[0].nodeValue); //returns "" - "content" needed
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

你想要的tagName,这是元素的名称. (对不起,对于Elements,tagName并且nodeName是相同的.)

问题是myParent元素的第一个子元素不是myChild元素,它是一个文本节点(包含空格).您的结构如下所示:

  • 元素"myParent"
    • 带有回车符和一些空格或制表符的文本节点
    • 元素"myChild"
      • 带有"内容"的文本节点
    • 带有回车符和一些空格或制表符的文本节点
  • 元素"myParent"
    • 带有回车符和一些空格或制表符的文本节点
    • 元素"myChild"
      • 带有"内容"的文本节点
    • 带有回车符和一些空格或制表符的文本节点

您需要向下导航到myChild可以getElementsByTagName再次执行的实际元素,或者只需扫描:

var x=xmlDoc.getElementsByTagName("myParent");
var c = x[1].firstChild;
while (c && c.nodeType != 1) { // 1 = ELEMENT_NODE
    c = c.nextSibling;
}
alert(c.nodeName); // "myChild"
Run Code Online (Sandbox Code Playgroud)

请注意,Elements没有有意义的nodeValue属性; 相反,您收集他们的子文本节点.(更多DOM规范:DOM2,DOM3.)

另请注意,索引到a时NodeList,索引从0.你似乎已经开始了1; 如果您因某个原因跳过第一个注释,请忽略此注释.


偏离主题:总是最好理解你正在使用的基础机制,我建议你使用直接DOM并参考上面列出的DOM规范.但是为了与这些树进行交互,一个好的库可以真正有用,并为您节省大量时间.jQuery适用于XML数据.我没有使用任何其他像Prototype,YUI,Closure其他任何一些 XML,所以不能说,但我希望至少有一些支持它.