2012-05-05 2 views
0

나는 phonegap과 함께 사용할 자바 스크립트에서 일부 XML 결과를 구문 분석하려고합니다.자바 스크립트로 XML 구문 분석 (phonegap에서 궁극적으로 사용하기 위해)

<Results> 
    <Result> 
      <FirstName>John</FirstName> 
      <Surname>Beech</Surname> 
      <Company>CompanyName</Company> 
      <Job_Title>Property Department</Job_Title> 
      <UserID>184</UserID> 
      <CompanyID>CompanyID</CompanyID> 
      </Result> 
    <Result> 
      <FirstName>Rosie</FirstName> 
      <Surname>Beech</Surname> 
      <Company>CompanyName</Company> 
      <Job_Title>Job Title</Job_Title> 
      <UserID>10494</UserID> 
      <CompanyID>17322</CompanyID> 
    </Result> 
</Results> 

그리고 난 그냥 응답을 경고 순간에 다음 자바 스크립트를 사용하고 있지만, 결국 내가 응답의 테이블을 만들려면 : 약자로 내 XML 레이아웃입니다.

<script language="javascript" type="text/javascript"> 
    window.onload = function() { 
     $.ajax({ 
      type: 'GET', 
      url: 'Lookupbysurname.aspx?surname=beech', 
      dataType: 'html', 
      success: function (data) { 


       try { 
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
        xmlDoc.async = "false"; 
        xmlDoc.loadXML(data); 
       } 
       catch (e) { 
        try { 
         parser = new DOMParser(); 
         xmlDoc = parser.parseFromString(data, "text/xml"); 
        } 
        catch (e) { 
         alert(e.message); 
         return; 
        } 
       } 

       for (var i = 0; i < xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].length; i++) { 
        alert(xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].nodeValue); 
       } 
      } 
     }); 
    } 
</script> 

그러나 지금은 동일한 응답을 계속 반복해서 알려주고 있습니다. 루프를 잘못 넣었습니까? JS의 루프는 나의 장점이 아닙니다! 어떤 도움을 주시면 감사하겠습니다.

+0

FWIW,시 이미 jQuery를 사용하고 있다면 XML 구문 분석 논리를 단순화하고 [$ .parseXML] (http://api.jquery.com/jQuery.parseXML/)을 사용할 수 있습니다. –

답변

2

는 다음과 같이 jQuery를에 싸여 XMLHttpRequestresponseXML 속성을 사용하여 parseXML()를 사용하여 방지 할 수 있습니다 XML :

var $xml = $(xmlDoc); 
$xml.find("CompanyID").each(function() { 
    alert($(this).text()); 
}); 

전체 코드 :

$.ajax({ 
    type: 'GET', 
    url: 'Lookupbysurname.aspx?surname=beech', 
    dataType: 'xml', 
    success: function(xmlDoc) { 
     var $xml = $(xmlDoc); 
     $xml.find('CompanyID').each(function() { 
      alert($(this).text()); 
     }); 
    } 
}); 
+0

감사합니다. xmlDoc는 어디에 정의되어 있습니까? xmlDoc이 정의되지 않았고 그 xmlDoc.getElementsByTagName이 함수가 아닙니다 - Tom – TMB87

+0

죄송합니다 - 특수하고 xmlDoc이 정의되지 않았지만 여전히 getElementsByTagName이 작동하지 않습니다 - http://paste.tiag.me/22 Tom – TMB87

+0

@TomBeech : 죄송합니다. 두 번째 코드 블록을'success' 메소드에 넣어야한다는 의미였습니다. 내 대답을 업데이트 할게. –

2

그러나 지금은 동일한 응답을 반복해서 알려주고 있습니다.

물론 동일한 색인 (0)을 사용하고 있습니다.

하지만이 TL 버전은 다음과 같습니다. 이미 jQuery를 사용하고 있으므로 jQuery 만 사용하십시오. 대신 $.parseXML을 사용하여 복잡한 파서 생성 논리를 대체 할 수 있지만 jQuery를 사용하여 루프를 수행 할 수도 있습니다. |

var xmlDoc = $.parseXML(data); 
var $xml = $(xmlDoc); 
$xml.find("CompanyID").each(function() { 
    alert($(this).text()); 
}); 

Live example : 여기 당신이 CompanyID 요소를 통해 루프를 시도하고 가정


source

는 코드가 i보다는 0을 사용하고, 그 최대 건물 :

for (var i = 0; i < xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].length; i++) { 
    // This is always 0 -----------------------------------------v 
    alert(xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].nodeValue); 
} 

당신은 당신이 자식 노드를 반복 할 것인지, i하지 0을 사용하고 싶습니다.


그러나 다시 가서 조회 때마다 반복하고 있기 때문에 그 루프는 상당히 비효율적 입니다. 대신 :

var nodes = xmlDoc.getElementsByTagName("CompanyID")[0].childNodes; 
for (var i = 0; i < nodes.length; i++) { 
    alert(nodes[i].nodeValue); 
} 

또는 교대 물론, firstChildnextSibling를 사용

var node; 
for (node = xmlDoc.getElementsByTagName("CompanyID")[0].firstChild; 
    node; 
    node = node.nextSibling) { 
    alert(node.nodeValue); 
} 

하지만 당신의 XML을보고, 나는 오히려 아이보다, 당신이 CompanyID 노드를 통해 루프를 원하는 의심 노드 :

var node; 
for (node = xmlDoc.getElementsByTagName("CompanyID"); 
    node; 
    node = node.nextSibling) { 
    alert(node.firstChild.nodeValue); 
} 

하지만 이미 사용중인 라이브러리를 더 많이 사용하여 코드를 크게 줄일 수 있습니다.이미 jQuery를 사용하고 있기 때문에, 당신은을 통과 할 jQuery를 사용할 수

$.ajax({ 
    type: 'GET', 
    url: 'Lookupbysurname.aspx?surname=beech', 
    dataType: 'xml', 
    success: function(xmlDoc) { 
     alert(xmlDoc.getElementsByTagName("CompanyID")[0].nodeValue); 
    } 
}); 

: :-)

+0

당신은 또한'nodes [0]'(두 번째 마지막 상자) 대신'nodes [i]'를 사용해야합니다. –

+0

@mru : LOL! 그 점을 지적 해 주셔서 감사합니다. –

+0

감사합니다. 그것은 크로스 도메인에서 작동합니까? Js는 원격 서버의 전화와 XML에 대해 로컬 일 것입니다. – TMB87