Сценарий Google App XmlService метод addNamespace добавляет пустые пространства имен XML к дочерним элементам
Я пытаюсь добавить пространство имен только для моего корневого элемента, но при этом создается впечатление, что это добавляет xmlns="" "ко всем прямым дочерним элементам. Это приводит к тому, что API Google AdWords возвращает ошибку. Вот мой код:
var adwordsNameSpace = XmlService.getNamespace('https://adwords.google.com/api/adwords/cm/v201809');
var root = XmlService.createElement('reportDefinition')
.setNamespace(adwordsNameSpace)
var selector = XmlService.createElement('selector')
var fields = ['Clicks', 'Ctr', 'Cost'];
fields.forEach(function (field) {
var xml = XmlService.createElement('fields').setText(field);
selector.addContent(xml)
})
root.addContent(selector)
var options = [
['reportName', 'Custom Report'],
['reportType', 'ACCOUNT_PERFORMANCE_REPORT'],
['dateRangeType', 'LAST_7_DAYS'],
['downloadFormat', 'XML']
]
options.forEach(function(option) {
root.addContent(XmlService.createElement(option[0]).setText(option[1]))
})
var document = XmlService.createDocument(root);
var xml = XmlService.getPrettyFormat().format(document);
Logger.log(xml);
И это конечный результат:
<?xml version="1.0" encoding="UTF-8"?>
<reportDefinition xmlns="https://adwords.google.com/api/adwords/cm/v201809">
<selector xmlns="">
<fields>Clicks</fields>
<fields>Ctr</fields>
<fields>Cost</fields>
</selector>
<reportName xmlns="">Custom Report</reportName>
<reportType xmlns="">ACCOUNT_PERFORMANCE_REPORT</reportType>
<dateRangeType xmlns="">LAST_7_DAYS</dateRangeType>
<downloadFormat xmlns="">XML</downloadFormat>
</reportDefinition>
Кто-нибудь знает, как я могу предотвратить или легко удалить эти пустые атрибуты xmlns?
1 ответ
Решение
После того, как вы объявите пространство имен в некотором родительском элементе, вы должны продолжать использовать это пространство имен в последующих элементах. XmlService.createElement
принимает второй параметр для пространства имен, поэтому вам не нужно вызывать отдельную функцию для установки пространства имен.
function XMLTest() {
var adwordsNameSpace = XmlService.getNamespace("https://adwords.google.com/api/adwords/cm/v201809");
var root = XmlService.createElement('reportDefinition', adwordsNameSpace);
var selector = XmlService.createElement('selector', adwordsNameSpace);
['Clicks', 'Ctr', 'Cost'].forEach(function (field) {
var xml = XmlService.createElement('fields', adwordsNameSpace).setText(field);
selector.addContent(xml)
});
root.addContent(selector);
var options = {
reportName: 'Custom Report',
reportType: 'ACCOUNT_PERFORMANCE_REPORT',
dateRangeType: 'LAST_7_DAYS',
downloadFormat: 'XML'
};
for (var tagName in options) {
root.addContent(XmlService.createElement(tagName, adwordsNameSpace).setText(options[tagName]))
}
var document = XmlService.createDocument(root);
var xml = XmlService.getPrettyFormat().format(document);
Logger.log(xml);
}
/* LOGGER OUTPUT:
<?xml version="1.0" encoding="UTF-8"?>
<reportDefinition xmlns="https://adwords.google.com/api/adwords/cm/v201809">
<selector>
<fields>Clicks</fields>
<fields>Ctr</fields>
<fields>Cost</fields>
</selector>
<reportName>Custom Report</reportName>
<reportType>ACCOUNT_PERFORMANCE_REPORT</reportType>
<dateRangeType>LAST_7_DAYS</dateRangeType>
<downloadFormat>XML</downloadFormat>
</reportDefinition>
*/