web-dev-qa-db-fra.com

xpath pour obtenir des données de nœud parent non distinctes pour chaque nœud enfant

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:

  • Date - /Show/Episodelist/Season/episode/airdate
  • Épisode No - /Show/Episodelist/Season/episode/seasonnum
  • Titre - /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?

1
jimbobmcgee

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.

1
Vidar S. Ramdal

Vous pouvez maintenant utiliser importxml et/ou importfeed.

Cela va automatiquement l'empiler pour vous:

=IMPORTXML("http://www.tvrage.com/the-layover/episode_list/all","//h1 |//*[@size='4']| //*[@class='b'][1]/tr | //*[@class='b'][2]/tr")

enter image description here

1
Aurielle Perlmann