You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apps Script Xml解析HTML本地正常,意大利客户端报错求助

问题描述

我使用XmlService编写了一段解析HTML的Apps Script代码,在自身英文环境(浏览器、系统、谷歌账号均为英文)下运行正常,但分享给意大利客户后出现错误提示:The markup in the document following the root element must be well-formed!。我困惑相同HTML代码为何在客户端报错,怀疑存在区域或语言设置问题,已尝试修改关联Google Sheet的区域设置,但无效。

待解析的HTML结构

<div dir="ltr">
   <div dir="ltr">
      <div align="center">
         <div style="font:20pt Times New Roman"><b>TITLE</b></div>
         <br></br>
         <table cellspacing="1" cellpadding="3" border="0">
         <tbody>
            <tr align="left">
               <td colspan="2"><b>Account: </b></td>
               <td colspan="5"><b>Name: a</b></td>
               <td colspan="2"><b>Currency: USD</b></td>
               <td colspan="2"><b>Leverage: </b></td>
               <td colspan="3" align="right"><b>2024 June 22, 09:14</b></td>
            </tr>
            <tr align="left"><td colspan="13"><b>Closed Transactions:</b></td></tr>
            <tr align="center" bgcolor="#C0C0C0">
            <td>Ticket</td>
            <td>Open Time</td>
            <td>Type</td>
            <td>Size</td>
            <td>Item</td>
            <td>Price</td>
            <td>S / L</td>
            <td>T / P</td>
            <td>Close Time</td>
            <td>Price</td>
            <td>Commission</td>
            <td>Taxes</td>
            <td>Swap</td>
            <td>Profit</td>
            </tr>
         </tbody>
         </table>
      </div>
   </div>
</div>

现有的Apps Script函数

function sanitizeHtml(htmlContent) {
  return htmlContent.replace(/<meta([^>]*?)\/?>/g, '<meta$1></meta>')
                    .replace(/<img([^>]*?)\/?>/g, '<img$1></img>')
                    .replace(/<br([^>]*?)\/?>/g, '<br$1></br>')
                    .replace(/<hr([^>]*?)\/?>/g, '<hr$1></hr>')
                    .replace(/&nbsp;/g, '&#160;')
                    .replace(/\s+nowrap/gi, '')
                    .replace(/\\(\#|0|,|\.|\\)/g, '$1');
}

function extractDateFromHtml(htmlContent) {
  // Parse the HTML content
  var sanitizedHtml = sanitizeHtml(htmlContent);
  var doc = XmlService.parse(sanitizedHtml);
}
解决方案

核心原因

报错并非区域设置直接导致,而是XmlService作为严格XML解析器,对HTML的宽松格式兼容性差。意大利环境下,HTML内容可能因编码转换、隐藏特殊字符(如区域相关空白或标点)出现不符合XML规范的结构,触发解析错误。

具体修复步骤

  1. 统一XML格式的空元素写法
    将现有函数中把空元素转为成对标签的逻辑,改为XML标准的自闭合标签,避免无效节点嵌套:
function sanitizeHtml(htmlContent) {
  // 清理前导/尾随空白,避免被当作额外节点
  htmlContent = htmlContent.trim();
  return htmlContent.replace(/<meta([^>]*?)\/?>/g, '<meta$1/>')
                    .replace(/<img([^>]*?)\/?>/g, '<img$1/>')
                    .replace(/<br([^>]*?)\/?>/g, '<br$1/>')
                    .replace(/<hr([^>]*?)\/?>/g, '<hr$1/>')
                    .replace(/&nbsp;/g, '&#160;')
                    .replace(/\s+nowrap/gi, '')
                    .replace(/\\(\#|0|,|\.|\\)/g, '$1');
}
  1. 包裹统一根节点
    XmlService要求解析内容必须有且仅有一个根节点,即使原HTML已有根<div>,也可能因隐藏字符触发多节点判断。修改函数为内容包裹<root>标签:
function sanitizeHtml(htmlContent) {
  htmlContent = htmlContent.trim();
  return '<root>' + htmlContent.replace(/<meta([^>]*?)\/?>/g, '<meta$1/>')
                    .replace(/<img([^>]*?)\/?>/g, '<img$1/>')
                    .replace(/<br([^>]*?)\/?>/g, '<br$1/>')
                    .replace(/<hr([^>]*?)\/?>/g, '<hr$1/>')
                    .replace(/&nbsp;/g, '&#160;')
                    .replace(/\s+nowrap/gi, '')
                    .replace(/\\(\#|0|,|\.|\\)/g, '$1') + '</root>';
}
  1. 强制UTF-8编码
    避免区域设置导致的编码转换问题,在解析前统一将内容转为UTF-8:
function extractDateFromHtml(htmlContent) {
  // 强制转换为UTF-8编码
  htmlContent = Utilities.newBlob(htmlContent).getDataAsString('UTF-8');
  var sanitizedHtml = sanitizeHtml(htmlContent);
  var doc = XmlService.parse(sanitizedHtml);
}
  1. 清理区域相关隐藏字符
    添加对意大利环境下可能出现的不可见空白字符的处理,避免解析异常:
// 在sanitizeHtml函数的替换逻辑中添加
.replace(/[\u00A0\u200B\u200C\u200D]/g, '&#160;')

内容的提问来源于stack exchange,提问作者Amna Irfan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:25:56