XmlService addNamespace 方法正在向子元素添加空白 XML 命名空间

XmlService addNamespace method is adding blank XML namespaces to child elements

我试图仅向根元素添加命名空间,但这样做似乎是向所有直接子元素添加 xmlns=""。这导致 Google AdWords API 到 return 错误。

这是我的代码:

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>

如何防止或轻松删除这些空白属性?

一旦您在某个父元素上声明了命名空间,您就必须继续在后续元素上使用该命名空间。 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>
*/