Google脚本:如何在XMLService getAttribute()方法中捕获执行错误

问题描述 投票:0回答:1

我正在Google工作表中使用Google脚本的这一部分来解析网页中的表格并存储结果:

    var doc = XmlService.parse(result);
    var html = doc.getRootElement();
    var resulttable = getElementsByClassName(html, 'resulttable')[0];

    var descendants = html.getDescendants();
    descendants.push(html);  
    for(var i in descendants) {
      var elt = descendants[i].asElement();  <== it crashes
      if(elt != null) {
        var test = elt.getAttributes();
        var test_bis = elt.getAttribute('http-equiv');   <== it does not crashes: 'http-equiv' exists
        var classes = elt.getAttribute('class');   <== it crashes:'class' does not exists
      }
    }

如图所示,在这段代码的标记行中有一些错误(简称为“服务器错误”)。我还放置了try-catch块,但它们没有捕获错误:脚本突然终止。我如何捕获错误,以便尽管出现这些xml错误,也让脚本继续运行?我的期望是当asElement()或getAttribute()方法失败时具有未定义的元素。

先谢谢您。

P.S。我根据注释中的要求编辑了问题,并添加了html页面的来源。要解析我正在使用this approach

的网址
  var url = "https://albopretorio.comune.gravina.ba.it/fo/?ente=GravinaInPuglia";
  var today = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy");

  var payload =
      {
        "tipoSubmit":"ricerca",
        "enti":"GravinaInPuglia",
        "uo":"",
        "tipoatto":"",
        "anno":"",
        "numda":"",
        "numa":"",
        "annoatto":"",
        "numatto":"",
        "datada":"",
        "dataa":"",
        "pubblicatoda":today,
        "pubblicatoa":"",
        "presenteal":"",
        "chiave":"",
        "provenienza":"",
      };

  var options =
      {
        "method"  : "POST",
        "payload" : payload,   
        "followRedirects" : true,
        "muteHttpExceptions": true
      };
var result = UrlFetchApp.fetch(url, options);
google-apps-script xml-parsing xmlservice
1个回答
1
投票

问题:

您不知道每个ContentType是哪个descendant,所以您不知道应该使用哪种方法来投射节点。

解决方案:

对于每个descendant,使用方法ContentType检查相应的getType()。您可以使用返回的值(ContentType)和switch statement来使用一种或另一种方法。

代码段:

for (var i in descendants) {
  var contentType = descendants[i].getType();
  var elt;
  switch (contentType.toString()) {
    case 'TEXT':
      elt = descendants[i].asText();
      break;
    case 'ELEMENT':
      elt = descedants[i].asElement();
      break;
    // Add other possible ContentTypes, if necessary

更新:getAttribute问题:

为了避免脚本尝试检索不存在的属性,您可以检索该元素的属性名称的数组,然后检查该数组中是否包含您的属性:

var attributes = elt.getAttributes().map(attribute => attribute.getName());
if (attributes.includes('class')) {
  var classes = elt.getAttribute('class');
}

参考:

© www.soinside.com 2019 - 2024. All rights reserved.