2014-10-23 2 views
4

У меня возникли трудности с анализом XML из запроса boardgamegeek, чтобы я мог заполнить листок Google данными. Вот пример BGG XML:Анализ XML с помощью скрипта Google Apps

<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> 

А вот Google Apps Script Я написал, чтобы разобрать его:

//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, он выглядит так же, как в примере выше. Однако, лесозаготовительные переменные дальше я получаю следующее:

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

Поскольку bggXml выглядит точно так же, как я ожидал, но документ не, я предполагаю, что проблема заключается в разборе?

ответ

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». Итерация через эти элементы, чтобы найти правильный, станет моей следующей задачей.

Смежные вопросы