2011-05-05 93 views
2

我需要获取标签“myChild”和“内容”的名称。 这很简单,但我卡住了,困了,这里是我得到我的测试:Javascript/XML - 获取节点名称

XML:

... 
<myParent> 
    <myChild>content</myChild> 
</myParent> 
<myParent> 
    <myChild>content</myChild> 
</myParent> 
... 

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 

回答

6

你想tagName,这是元素的名称。(很抱歉,对于Element S,tagNamenodeName是相同的。)

的问题是,你的myParent元素的第一个孩子是不是myChild元素,它是一个文本节点(含空格) 。您的结构是这样的:

  • 元素“myParent”用回车和一些空格或制表符
    • 文本节点
    • 元素“myChild”与“内容”
      • 文本节点
    • 带回车符和一些空格或制表符的文本节点
  • 元素“myParent”以回车和一些空格或制表符
    • 文本节点
    • 元素“myChild”与“内容”
  • 文本节点与滑架
    • 文本节点返回有的空格或制表符

你的东东d向下进入实际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" 

注意Element都不具备的一个有意义的nodeValue财产;相反,您收集他们的子文本节点。 (更多DOM规格:DOM2,DOM3。)

另请注意,索引到NodeList时,索引开始于0。你似乎已经开始使用1;如果您因为某个原因而跳过第一个,则忽略此评论。


题外话:它总是最好知道你正在使用什么样的底层机制,我也建议与直DOM玩弄并参照上面列出的DOM规范。但是为了与这些树木互动,一个好的图书馆可能会非常有用,并为您节省大量时间。 jQuery适用于XML数据。我没有使用任何其他的像PrototypeYUIClosureany of several others与XML,所以不能说话,但我希望至少有一些人支持它。

+0

@TJ +1非常好。 – 2011-05-05 12:12:32

0

改为尝试x[1].getElementsByTagName('*')[0]

(这仅仅是指数0可信,其他指标可以退回没有子节点元素,如果直接孩子的含有其它元素节点。)