Google Spreadsheets a une fonction IMPORTXML que j'essaie d'utiliser pour gérer une liste d'épisodes télévisés, basée sur l'API située à l'adresse http://services.tvrage.com/feeds/episode_list.php. ? sid = 3183 .
J'essaie d'obtenir une table de Date | Season No | Episode No | Title
à partir de ce XML.
Le XML est hiérarchique, imbriquant des épisodes sous des saisons.
Je peux obtenir mes colonnes de date, d'épisode et de titre en utilisant xpath:
/Show/Episodelist/Season/episode/airdate
/Show/Episodelist/Season/episode/seasonnum
/Show/Episodelist/Season/episode/title
Cependant, je n'arrive pas à trouver le xpath qui convient pour extraire le numéro de saison pour chaque entrée d'épisode, qui est l'attribut no
du nœud parent Season
.
J'ai essayé:
/Show/Episodelist/Season/episode/../@no
/Show/Episodelist/Season/episode/parent::Season/@no
Ces deux éléments permettent d’obtenir une liste distincte de saisons, c’est-à-dire:
Date Season Episode Title
01-01-2001 1 1 foo
02-01-2001 2 2 bar
03-01-2001 3 3 baz
04-01-2001 4 fee
05-01-2001 5 fob
01-03-2002 1 bix
02-03-2002 2 buz
03-03-2002 3 fez
04-03-2002 4 baj
... alors que je cherche:
Date Season Episode Title
01-01-2001 1 1 foo
02-01-2001 1 2 bar
03-01-2001 1 3 baz
04-01-2001 1 4 fee
05-01-2001 1 5 fob
01-03-2002 2 1 bix
02-03-2002 2 2 buz
03-03-2002 2 3 fez
04-03-2002 2 4 baj
Quel est le chemin xpath correct pour que la routine IMPORTXML ne fasse pas d'opération distincte sur les données importées?
Comme indiqué dans mon commentaire, cela avec =importXML
et XPath semble délicat.
Mais le faire par programme, en utilisant le XmlService de Script Google Apps , semble plus facile.
J'ai écrit ce qui suit:
function parseTvRageXml(url) {
var result = [];
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();
var show = document.getRootElement();
var episodeList = show.getChild("Episodelist");
var seasons = episodeList.getChildren("Season");
for (var i = 0; i < seasons.length; i++) {
var season = seasons[i];
var seasonNum = season.getAttribute("no").getValue();
var episodes = season.getChildren("episode");
for (var j = 0; j < episodes.length; j++) {
var episode = episodes[j];
var resultRow = [];
resultRow.Push(seasonNum);
resultRow.Push(episode.getChild("epnum").getText());
resultRow.Push(episode.getChild("seasonnum").getText());
resultRow.Push(episode.getChild("airdate").getText());
resultRow.Push(episode.getChild("link").getText());
resultRow.Push(episode.getChild("title").getText());
result.Push(resultRow);
}
}
return result;
}
En effet, il extrait le contenu de l’URL donnée, l’analyse au format XML et itère à travers les éléments, en extrayant les valeurs des éléments souhaités, qui sont stockées dans un tableau à 2 dimensions (result
), puis renvoyées. .
Pour utiliser cela, vous devez installer le script dans votre feuille de calcul. Cliquez sur le menu Outils → Editeur de script et collez le code ci-dessus. . Enregistrez le script.
Dans la cellule où vous voulez la sortie, entrez
=parseTvRageXml("http://services.tvrage.com/feeds/episode_list.php?sid=3183")
Le résultat devrait être une liste d'épisodes, avec les colonnes suivantes:
Season number | epnum | seasonnum | airdate | link | title
J'ai mis en place n exemple de feuille de calcul pour le démontrer, n'hésitez pas à le copier.