Как проверить XML, чтобы увидеть, содержит ли он элемент в скрипте Google Apps?
Я использую код ниже, чтобы захватить длину подкаста (т.е. <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) {
};
};
};
Все это говорит о том, что обе эти попытки представляют собой обходные пути, которые имеют гораздо лучшее решение. Поэтому у меня есть два следующих вопроса:
- Есть ли какая-то функция, которая проверяет, существует ли элемент в XML?
- Почему
.getText()
иногда возвращать пустую строку, когда элемент не пустой?