Как исправить «GetChildText (имя элемента строки, пространство имен строки)» в Google Scripts при анализе RSS-канала? - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над сценарием Google, используя редактор сценариев Google Sheets Script, который собирается проанализировать RSS-канал iTunes.

Я использовал службу XML - документация предоставлена ​​ здесь - и это кажется довольно простым, пока я не наткнулся на элементы пространства имен iTunes. Метод для анализа XML-элементов вместе с их пространствами имен, как это предусмотрено Google:

getChildText(name, namespace)

Где параметры name и namespace находятся в строке. Поэтому, следуя предоставленной документации и примерам, я попробовал этот код:

function customScraperRSSFeed() {
 var xml = UrlFetchApp.fetch('http://feeds.soundcloud.com/users/soundcloud:users:279094703/sounds.rss').getContentText();
var document = XmlService.parse(xml);
var ituneEntries = document.getRootElement().getChildText('email', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
Logger.log(ituneEntries);
}

Снимок моего кода также можно найти здесь .

Но почему-то, если я запускаю этот код, я получаю следующую ошибку:

Cannot find method getChildText(string,string)

Я знаю, что есть другие методы, включая getChild (name, namespace) , который следует по тому же пути.

Вот теги с пространством имен iTunes, которые я хочу проанализировать . Платформа не позволяет мне прикреплять изображения напрямую, поэтому, пожалуйста, потерпите меня.

А вот ссылка на полный RSS-канал: http://feeds.soundcloud.com/users/soundcloud:users:279094703/sounds.rss

Теперь я хочу знать, что-то не так с кодом, который я делаю? Я попробовал все варианты, и я даже попробовал это:

var xml = UrlFetchApp.fetch('http://feeds.soundcloud.com/users/soundcloud:users:279094703/sounds.rss').getContentText();
 var document = XmlService.parse(xml);
 var ituneEntries = document.getRootElement().getChildren('channel');
 for(var i=0; i<ituneEntries.length; i++)
    {
      var name = ituneEntries[i].getName();
      if(name=='subtitle')
      {
        Logger.log(ituneEntries[i].getText());
      }
      else if(name=='owner')
      {
        var ownerInformation = ituneEntries[i].getChildren();
        Logger.log(ownerInformation[0].getText());
        Logger.log(ownerInformation[1].getText());
      }
    }

Что касается вышеприведенного кода, у меня был план перебрать все элементы по требуемым именам тегов и затем получить их значения, и даже тогда я получал значения NULL для некоторых тегов.

Поэтому, исходя из приведенного выше объяснения проблемы, любая помощь или обходной путь для этой проблемы будут высоко оценены.

Спасибо!

1 Ответ

0 голосов
/ 10 июня 2019
  • Вы хотите получить все значения, когда префикс пространства имен равен itunes.
  • Например, когда есть <itunes:Tag Name>sample value</itunes:Tag Name>, вы хотите получить sample value.
  • Вы хотите добиться этого с помощью Google Apps Script.

Я мог бы подтвердить, как указано выше. Если мое понимание верно, как насчет этого примера сценария? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Пример сценария:

function myFunction() {
  var xml = UrlFetchApp.fetch('http://feeds.soundcloud.com/users/soundcloud:users:279094703/sounds.rss').getContentText();
  var document = XmlService.parse(xml);
  var c = document.getRootElement().getChild('channel').getChildren();
  for (var i = 0; i < c.length; i++) {
    if (c[i].getName() == 'item') {
      var item = c[i].getChildren();
      for (var j = 0; j < item.length; j++) {
        if (item[j].getNamespace().getPrefix() == 'itunes') {
          Logger.log("%s, %s", item[j].getName(), item[j].getValue())
        }
      }
    }
  }
}

Справка:

...