2014-10-23 3 views
4

boardgamegeek 쿼리에서 XML 구문을 분석하는 데 문제가있어서 Google 시트에 데이터를 채울 수 있습니다. 구문 분석하기 위해 Google 애플리케이션 스크립트 내가 작성한 것 여기Google Apps Script를 사용하여 XML을 구문 분석합니다.

<boardgames termsofuse="http://boardgamegeek.com/xmlapi/termsofuse"> 
    <boardgame objectid="423"> 
    <yearpublished>1995</yearpublished> 
    <minplayers>3</minplayers> 
    <maxplayers>6</maxplayers> 
    <playingtime>300</playingtime> 
    <name primary="true" sortindex="1">1856</name> 
    </boardgame> 
</boardgames> 

을 그리고 : 다음은 BGG의 XML의 예

//get the data from boardgamegeek 
    var url = 'http://www.boardgamegeek.com/xmlapi/boardgame/' + bggCode; 
    var bggXml = UrlFetchApp.fetch(url).getContentText(); 

    var document = XmlService.parse(bggXml); 
    var root = document.getRootElement();  
    var entries = new Array(); 
    entries = root.getChildren('boardgame'); 

    for (var x = 0; x < entries.length; i++) { 
    var name = entries[x].getAttribute('name').getValue(); 
    var yearpublished = entries[x].getAttribute('yearpublished').getValue(); 
    var minplayers = entries[x].getAttribute('minplayers').getValue(); 
    var maxplayers = entries[x].getAttribute('maxplayers').getValue(); 
    } 
    //SpreadsheetApp.getActiveSheet().getRange(i+1,7).setValue(yearpublished); 
    Logger.log(entries); 

나는 현재에 오류가있어에 대한 루프에 의해 발생 항목이 NULL입니다. 루프를 주석 처리하고 bggXml이 어떻게 생겼는지 기록하면 위의 예와 비슷하게 보입니다. bggXml 이후

document => [Document: No DOCTYPE declaration, Root is [Element: <boardgames/>]] 
root => [Element: <boardgames/>] 
entries => [[Element: <boardgame/>]] 
entries[2] => undefined 

내가 기대하지만, 문서, 나는 문제가 구문 분석에 가정하지 않는 방법을 정확하게 보이는 그러나, 로깅 변수는 더 아래 나는 다음과 같은거야?

답변

6

많은 시행 착오와 어둠 속에서 걸려 넘어져서 나는 내가 찾고있는 해결책을 발견했다. 이것은 개별 xml 요소의 값을 가져 와서 변수로 설정합니다.

var yearpublished = root.getChild('boardgame').getChild('yearpublished').getText(); 

그래서 최종 코드는 다음과 같습니다. 당신의 노력에 도움이되기를 바랍니다.

//get the data from boardgamegeek 
    var url = 'http://www.boardgamegeek.com/xmlapi/boardgame/' + bggCode; 
    var bggXml = UrlFetchApp.fetch(url).getContentText(); 

    var document = XmlService.parse(bggXml); 
    var root = document.getRootElement(); 

    //set variables to data from bgg 
    var yearpublished = root.getChild('boardgame').getChild('yearpublished').getText(); 
    var minplayers = root.getChild('boardgame').getChild('minplayers').getText(); 
    var maxplayers = root.getChild('boardgame').getChild('maxplayers').getText(); 
    var playingtime = root.getChild('boardgame').getChild('playingtime').getText(); 
    var name = root.getChild('boardgame').getChild('name').getText(); 

    //populate sheet with variable data 
    SpreadsheetApp.getActiveSheet().getRange(i+1,1).setValue(name); 
    SpreadsheetApp.getActiveSheet().getRange(i+1,4).setValue(minplayers); 
    SpreadsheetApp.getActiveSheet().getRange(i+1,5).setValue(maxplayers); 
    SpreadsheetApp.getActiveSheet().getRange(i+1,5).setValue(playingtime); 
    SpreadsheetApp.getActiveSheet().getRange(i+1,7).setValue(yearpublished); 

BGG를 쿼리하는 경우에는 여러 개의 이름 요소가 있습니다. 기본 속성이 "true"로 설정된 속성을 원합니다. 올바른 요소를 찾기 위해 해당 요소를 반복하면 내 다음 과제가됩니다.

관련 문제