2011-05-05 128 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可信,其他指標可以退回沒有子節點元素,如果直接孩子的含有其它元素節點。)