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>
*/
我试图仅向根元素添加命名空间,但这样做似乎是向所有直接子元素添加 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>
*/