【问题标题】:Google Scripts: XML parsing errorsGoogle Scripts:XML 解析错误
【发布时间】:2018-01-26 11:02:25
【问题描述】:

我有一个谷歌脚本,它可以在服务器上找到一个特定的 .zip 文件夹,提取文件,然后处理一个特定的 .xml 文件。我的问题是将此文件转换为正确的格式。

代码的适用sn-p:

  var dir = UrlFetchApp.fetch(url);
  var b = dir.getBlob();
  var files = Utilities.unzip(b);
  var vesselDataBlob;
  for (var i = 0; i < files.length; i++) {
    if (files[i].getName().equals("dat/vesselDataMod.xml")) {  //finds file with appropriate name
      vesselDataBlob = files[i];
      break;
    }
  }
  var vesselData = vesselDataBlob.getDataAsString(); // Returns FULL document as a string.
  var data = XmlService.parse(vesselData); // Throws error.

vesselData是xml格式,vesselData.getContentType()返回“text/xml”。

但是,我正在努力寻找解析数据的方法。 XmlService.parse(vesselData) 抛出错误:“prolog 中不允许内容。”我尝试使用 DOMParser,它也会引发错误。我设置代码的方式有问题吗?数据实际上不是xml格式的吗?

大多数人可能会做的事情与我的情况之间的明显区别在于,我是从压缩文件夹中提取文件,而不是直接从网站中提取文件。不是这个问题,我试过只用上传到云端硬盘的xml文件,还是出现了同样的问题。

我可以设置字符串操作来获取我需要的数据,但如果有人可以提供帮助,我宁愿不努力。谢谢!

我一直在使用这个 xml 的 sn-p 进行调试:

<?xml version="1.0" encoding="UTF-8"?>
<vessel_data version="2.1">
    <hullRace ID="0" name="TNS" keys="player">
        <taunt immunity="Yadayada" text="More yadayada"/>
    </hullRace>
</vessel_data>

【问题讨论】:

    标签: javascript xml google-apps-script xml-parsing


    【解决方案1】:

    下面的函数对我来说适用于一个非常简单的 zip 文件。我建议您尝试 getDataAsString("UTF-8") 看看是否能解决问题。

    function test() {
      var f = DriveApp.getFilesByName("ingest.zip").next();
      var files = Utilities.unzip(f.getBlob());
      for(var i=0; i<files.length; i++) {
        var ff = files[i];
        if (/\.xml$/.test(ff.getName())){
          var s = XmlService.parse(ff.getDataAsString());
          Logger.log(s);
          s = XmlService.parse(ff.getDataAsString("UTF-8"));
          Logger.log(s);      
          break;
        }    
      }
    }
    

    【讨论】:

    • 据我所知,这与我已经拥有的几乎完全相同。我确实尝试过 getDataAsString("UTF-8"),虽然 UTF-8 是默认值,但它什么也没改变。是否与 .zip 文件位于外部服务器而不是 Drive 上有关?
    • 我还检查了/\.xml$/.test(ff.getName()) 是否属实,并且与我当前的代码一致。
    • 我不知道。希望其他人可以在这里提供一些见解。我假设您已经验证了 zip 中的 xml 文件是有效的。如果您尝试在 zip 中解析更简单的 xml 文件会发生什么。
    • 我尝试在不处理压缩文件夹的情况下将一个简短的 xml 文件上传到谷歌驱动器,它产生了同样的错误:“prolog 中不允许内容。”
    • 您能否粘贴您的示例 xml(或指向包含该 xml 的要点的链接)?
    【解决方案2】:

    我将您的 XML 文件放入一个 gist(作为 XML,而不是 zip)并进行解析。

    function test2() {
      var f = UrlFetchApp.fetch("...gisturl.../test.xml").getBlob(
    );
      var s = XmlService.parse(f.getDataAsString());
      Logger.log(s.getDescendants().length);      
    }
    

    不幸的是,我现在无法让 Utilities.unzip() 在上传到 Google Drive 的 zip 文件上运行。希望其他用户能给你一个更好的解决方案。

    【讨论】:

    • 修复了,但还是没有运气:/
    • 我尝试了Logger.log(file.getAs("text/xml"));,但出现错误:“不支持从 application/octet-stream 转换为 text/xml。”我不确定八位字节流是什么......这可能是相关的。
    • 不,那是无关的,我忘记了事情。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多