我需要使用电子表格中的特定数据生成XML文档。
我正在使用GoogleScript,但我没有看到任何库来帮助我生成XML。 (标准XML服务仅解析XML)
我是不是被迫这样做了,还是我错过了什么?
您能推荐一些可能有助于生成XML的库或Javascript函数吗?
由于
答案 0 :(得分:7)
您可以使用HtmlService模板构建XML文档。您可以使用Xml服务创建文档,方法是从空文档(Xml.parse('')或类似的东西)开始,然后使用Xml.element()等操作它,但是我我怀疑第一个想法要容易得多。
答案 1 :(得分:4)
最近,我发现了使用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>
答案 2 :(得分:0)
将其粘贴到excel中,然后导出。
否则使用Apache的C-Xerces
答案 3 :(得分:0)
According to Google正确的方法是使用parseJS将嵌套的javascript数组转换为XML。
创建可以序列化为字符串的XmlDocument实例 通过XmlDocument.toXmlString()表示,使用该方法 parseJS(jsObject),它从嵌套的一组构建XML文档 JavaScript数组。
该页面上的链接不好,但you can find the documentation for parseJS here.
我不喜欢这种方法,但我发现他们的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是未格式化的,但由于我只是将它推入数据库(我打算稍后自动化的更新过程),我不在乎。
对于属性使用列标题会更聪明,但我不想从客户端弄乱源文档。
您可以看到the source spreadsheet以及the output进行比较。