5

我需要使用电子表格中的特定数据生成 XML 文档。

我正在使用 GoogleScript,但没有看到任何库可以帮助我生成 XML。(标准的 XML 服务只解析 XML)

我是被迫手动做这个还是我错过了什么?

你能推荐任何可能有助于生成 XML 的库或 Javascript 函数吗?

谢谢

4

4 回答 4

7

您可以使用 HtmlService 模板构建 XML 文档。您还可以使用 Xml 服务创建文档,方法是从空文档(Xml.parse('') 或类似的东西)开始,然后使用 Xml.element() 等操作它,但我怀疑第一个想法容易得多。

于 2012-08-02T15:00:08.850 回答
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>

于 2012-08-30T14:16:07.237 回答
0

将其粘贴到excel中,然后导出。

否则使用 Apache 的 C-Xerces

于 2012-08-02T14:55:31.483 回答
0

根据谷歌的说法,正确的方法是使用 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 未格式化,但因为我只是将它推入数据库(我打算稍后自动化的更新过程),所以我不在乎。

对属性使用列标题会更聪明,但我不想弄乱来自客户端的源文档。

您可以查看源电子表格以及用于比较的输出。

于 2013-06-11T22:33:39.613 回答