2010-06-23 53 views
0

我在javascript中通過E4x檢索屬性值時遇到問題。Javascript E4X:如何正確迭代屬性XMLList?

假設像以下作爲XMLObject組成XML節點的列表:

<node att1="value1" att2="value2" att3="value3" att4="value4"> 
    <nodeChild><!CDATA[/* ... */]></nodeChild> 
    /* more node childs */ 
</node> 

我正常訪問的節點(在循環中)和它的屬性節點使用attributes()方法:

var attributes = node[n].attributes() ; 
    for(var n = 0 ; n < attributes.length() ; n++) { 
     var name = attributes[n].name() ; 
     var value = attributes[n].toString() ; 
     //.. handle the values 
    } 

現在,例如,名稱和值沒有被充分返回,值(n)返回名稱(n + 1)的值,即att1的值將是value2;如果我設置了var value = attributes[ (n+1) ].toString(),則數值將正確返回,但第一個值將返回undefined

可能我只是在這個密集。那麼,有沒有人有任何指向我失蹤的指針?

TIA,

FK

+0

我不確定這裏發生了什麼,但是「名稱」真的是一個函數,而不僅僅是一個簡單的字符串? – Pointy 2010-06-23 13:46:16

+0

是的,它是-E4X很奇怪,它的行爲與你期望的正常DOM或JS對象的行爲不同。這個例子對我來說很好,除了''n'.attributes()'中'n'的位置不清楚之外。當然,如果處理這些值會改變屬性,那麼這可能會造成破壞性的迭代問題。 – bobince 2010-06-23 15:03:47

+0

以上是僞代碼。我的用例(用於Java類的Rhino中的JS xml解析函數)要複雜得多,所以我提取了這個問題。我應該說明。抱歉。 – FK82 2010-06-24 04:13:26

回答

2

你的代碼工作對我來說,除了這些陷阱,我敢肯定,在你實際的XML因爲你可以通過它們來解析和迭代不存在:

  1. CDATA聲明無效。改爲<![CDATA[..]]>
  2. /* more node childs */使得替換n0無效
  3. 的XML,或者沒有它可以做到完全

這是我用來遍歷節點屬性確切的代碼。

var node = <node att1="value1" att2="value2" att3="value3" att4="value4"> 
    <nodeChild><![CDATA[/* ... */]]></nodeChild> 
</node>; 

var attributes = node[0].attributes() ; 
for(var n = 0 ; n < attributes.length() ; n++) { 
    var name = attributes[n].name() ; 
    var value = attributes[n].toString() ; 
    console.log("%s = %s", name, value);  
} 

// log output 
// att1 = value1 
// att2 = value2 
// att3 = value3 
// att4 = value4 

注意E4X提供寫了上更簡潔的方式(結合for each inJavaScript 1.6介紹):

for each(var attribute in [email protected]*) { 
    var name = attribute.name(); 
    var value = attribute.toString(); 
} 

既然你指的是一個XML對象,沒有必要引用索引中的根元素如node[0]。你可以簡單地寫node

+0

感謝您的回答。這是僞代碼,我的實際xml是有效的。我相信''for each in'語法在'Rhino'中是不可用的(因爲它還沒有包含JavaScript 1.6)。我在從Rhino上下文中調用的JS函數中使用E4X。你在測試中使用了我的「for循環」嗎? – FK82 2010-06-24 04:20:59

+0

我沒有在Rhino上測試它,但是我測試了你的for循環版本,並提供了我之前提到的更改 - 基本上我在Firefox上面粘貼了完全相同的代碼。 – Anurag 2010-06-24 04:32:44

+0

好的,錯誤必須在其他地方。好的事情要知道,我不會在編寫基本語法時失敗。 :-) 謝謝。 – FK82 2010-06-24 05:33:15