Как проверить XML, чтобы увидеть, содержит ли он элемент в скрипте Google Apps? - PullRequest
0 голосов
/ 26 октября 2018

Я использую приведенный ниже код для получения длины подкаста (т.е. элемента <itunes:duration>) из RSS-канала.Это прекрасно работает на большинстве RSS-каналов (например, этот ), но не работает на пару каналов (например, этот ).

var xml_text = UrlFetchApp.fetch(input).getContentText();
var document = XmlService.parse(xml_text);
var title = document.getRootElement().getChild("channel").getChild("title").getText();
if (xml_text.indexOf("itunes:duration") >= 0) {
  var items = document.getRootElement().getChild("channel").getChildren("item");
  var itunes = XmlService.getNamespace('http://www.itunes.com/dtds/podcast-1.0.dtd');
  for (var ind = 0; ind < items.length; ind++) {
    var item_text = items[ind].getText(); // <--- PROBLEM!!!
    if (item_text.indexOf("itunes:duration") >= 0) {
      length[ind] = hmsToSecondsOnly(items[ind].getChild("duration", itunes).getText());
      totLength = totLength + length[ind];
      if (length[ind] != 0) {
        lengthCount = lengthCount + 1;
      };
    };
  };
};

Когдаэто не работает, строка, помеченная <--- PROBLEM, заставляет item_text быть пустой.

Для ясности, я знаю, что элемент существует, потому что когда я использую try-catch вместо этого (см. ниже)требуемые данные добавляются в массив, когда они существуют, а когда их нет, ошибка, возникающая при попытке получить несуществующий элемент XML, игнорируется (как и предполагалось).

var xml_text = UrlFetchApp.fetch(input).getContentText();
var document = XmlService.parse(xml_text);
var title = document.getRootElement().getChild("channel").getChild("title").getText();
if (xml_text.indexOf("itunes:duration") >= 0) {
  var items = document.getRootElement().getChild("channel").getChildren("item");
  var itunes = XmlService.getNamespace('http://www.itunes.com/dtds/podcast-1.0.dtd');
  for (var ind = 0; ind < items.length; ind++) {
    try {
      length[ind] = hmsToSecondsOnly(items[ind].getChild("duration", itunes).getText());
      totLength = totLength + length[ind];
      if (length[ind] != 0) {
        lengthCount = lengthCount + 1;
      };
    } catch (ignore) {

    };
  };
};

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

  1. Существует ли какая-то функция, которая проверяет, существует ли элемент в XML?
  2. Почему .getText() иногда возвращает пустойстрока, когда элемент не пустой?
...