2010-06-23 4 views
0

자바 스크립트에서 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 
    } 

을 이제는 이름과 값이 적절히 반환되지 않습니다. value (n)은 name (n + 1)의 값을 반환합니다. 즉 att1의 값은 value2입니다. var value = attributes[ (n+1) ].toString()을 설정하면 값이 올바르게 반환되지만 첫 번째 값은 undefined을 반환합니다.

가능합니다. 저는이 부분에 밀도가 있습니다. 그래서, 내가 누락 된 부분에 대한 조언을 누군가가 가지고 있습니까?

TIA,

FK

+0

나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠지만, 단순한 문자열이 아닌 "이름"은 실제로 함수입니까? – Pointy

+0

예, 그것은 -E4X가 이상하고 정상적인 DOM 또는 JS 객체를 기대하는 방법과 다르게 동작합니다. 이 예제는 나를 위해 잘 작동한다.'n '이'node [n] .attributes()'에서 어디서 왔는지 분명하지 않다. 물론 '// .. 값을 처리하면'속성이 변경되면 잠재적으로 파괴적인 반복 문제가 발생할 수 있습니다. – bobince

+0

위 코드는 의사 코드입니다. 내 유스 케이스 (자바 클래스에서 사용되는 Rhino의 JS xml 파싱 함수)는 훨씬 더 복잡하므로이 문제를 추상화했다. 나는 그것을 말해야했다. 죄송합니다. – FK82

답변

2

귀하의 코드는 당신이 그들을 통해 분석하고 반복 할 수 있기 때문에 실제 XML에 존재하지 않는 확신이 개는 그렇다하고, 나를 위해 작동 :

  1. CDATA 선언이 유효하지 않습니다. 0n 대체
  2. 유효하지 않은 XML이 <![CDATA[..]]>
  3. /* more node childs */에하게 변경하거나 아예없이

을 할 수 여기에 내가 노드의 속성을 반복하는 데 정확한 코드가있다. E4X 위를 기록 좀 더 간결 방법을 제공

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 

참고 (JavaScript 1.6에 도입 for each in와 함께) :

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 loop'을 사용 했습니까? – FK82

+0

Rhino에서 테스트하지는 않았지만 앞서 언급 한 변경 사항 (기본적으로 위의 코드를 Firefox에 붙여 넣은 코드와 동일)으로 for 루프 버전을 테스트했습니다. – Anurag

+0

좋아요, 오류는 다른 곳에서 발생해야합니다. 기본 구문을 작성하는 데 실패하지 않는다는 것을 아는 것이 좋습니다. :-) 감사. – FK82