我需要使用电子表格中的特定数据生成 XML 文档。
我正在使用 GoogleScript,但没有看到任何库可以帮助我生成 XML。(标准的 XML 服务只解析 XML)
我是被迫手动做这个还是我错过了什么?
你能推荐任何可能有助于生成 XML 的库或 Javascript 函数吗?
谢谢
我需要使用电子表格中的特定数据生成 XML 文档。
我正在使用 GoogleScript,但没有看到任何库可以帮助我生成 XML。(标准的 XML 服务只解析 XML)
我是被迫手动做这个还是我错过了什么?
你能推荐任何可能有助于生成 XML 的库或 Javascript 函数吗?
谢谢
您可以使用 HtmlService 模板构建 XML 文档。您还可以使用 Xml 服务创建文档,方法是从空文档(Xml.parse('') 或类似的东西)开始,然后使用 Xml.element() 等操作它,但我怀疑第一个想法容易得多。
最近我发现了一种使用GAS 中存在的XML
类(不是)生成 XML 的能力。Xml
一个例子如下
function makeXML() {
var xml = new XML('<a/>');
xml['@attrib1'] = 'atribValue';
xml.data = 'dataValue';
xml.data.sub_data = 'subDataValue';
return xml.toString();
}
function doGet(e) {
var app = UiApp.createApplication();
app.add(app.createLabel(makeXML()));
return app;
}
此脚本的输出是<a attrib1="atribValue"> <data> dataValue <sub_data>subDataValue</sub_data> </data> </a>
将其粘贴到excel中,然后导出。
否则使用 Apache 的 C-Xerces
根据谷歌的说法,正确的方法是使用 parseJS 将一组嵌套的 javascript 数组转换为 XML。
要创建可以通过 XmlDocument.toXmlString() 序列化为字符串表示的 XmlDocument 实例,请使用方法 parseJS(jsObject),它从一组嵌套的 JavaScript 数组构建 XML 文档。
该页面上的链接不好,但您可以在此处找到 parseJS 的文档。
我不喜欢这种方法,但我发现他们的 XML 模块上的文档的创建方面很差,所以这是我选择的方法。在我的情况下,我需要将每一行映射到一个元素中,其中一些是子元素,一些是属性。这可以写得更简短,但我不确定它会更容易理解。至少对我来说不是。
所以这是我为我的需要提出的解决方案,它创建顶部封闭的 XML,然后逐个节点添加。完成后,它会打开一个匹配的 google 文档并将呈现的 XML 放入其中。有一些非常基本的检查来确保我有最少需要的单元格,所以如果我的一个用户输入了错误的行,我就跳过它。它还让我不必担心底部多余的空白行等。
var now = new Date();
var UTCString = '';
UTCString = UTCString.concat(now.getFullYear(),'-',now.getMonth()+1,'-',now.getDate(),'T',now.getHours(),':',now.getMinutes(),':',now.getSeconds(),'+00:00');
var fullDoc = ["entities", {"type":"federal-body"}, {"updated":UTCString}];
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
// This selects ALL the data w/o having to specify a range
var range = sheet.getDataRange();
var values = range.getValues();
// This logs the spreadsheet in CSV format with a trailing comma
for (var i in values) {
//not elegant but worth it for the get-all-range
if (i==0)
continue;
if (values[i][0] && values[i][2]) {
//make an object if column 1 is empty
//column 0 is the id attribute
//column 1, if present, is the parent-id attribute
if (values[i][1]) {
var node = ["entity", {"id": values[i][0]}, {"parent-id": values[i][1]} ];
} else {
var node = ["entity", {"id": values[i][0]} ];
}
//column 2 is the name value and has the attribute of role:official
node.push([ "name", {"role" : "official"}, values[i][2] ]);
//column 3, if present, is the abbr value
if (values[i][3]) {
node.push([ "abbr", values[i][3] ]);
}
//column 4, if present, is a name value with role:historical
if (values[i][4]) {
node.push([ "name", {"role" : "historical"}, values[i][3] ]);
}
//column 5, if present, is a name value with role:leadership
if (values[i][5]) {
node.push([ "name", {"role" : "leadership"}, values[i][5]]);
}
fullDoc.push(node);
}
}
var xml = Xml.parseJS(fullDoc);
//put it in the file
var doc = DocumentApp.openByUrl('https://docs.google.com/document/d/17WNYtvjCgR-w3m3tIFNmHlr3aVLqfUaobGqFu-hIGks/edit');
var header = doc.getHeader();
if (header)
header.clear();
var footer = doc.getFooter();
if (footer)
footer.clear();
var body = doc.getBody();
body.setText(xml.toXmlString());
目前我已将其放入需要手动运行的菜单项中,但最终我会考虑在保存时触发它。输出 XML 未格式化,但因为我只是将它推入数据库(我打算稍后自动化的更新过程),所以我不在乎。
对属性使用列标题会更聪明,但我不想弄乱来自客户端的源文档。