Сценарий 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>
*/
Другие вопросы по тегам