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

Dynamics 365 CRM中FetchXML含&等特殊字符的Lookup过滤失效问题

在Dynamics 365中用FetchXML过滤含特殊字符的字段(如&)的正确处理方式

你在JavaScript中通过FetchXML过滤Dynamics 365的自定义文本字段my_variantstatus,需要排除值为R&D Stage和Discontinued的产品,但遇到了特殊字符(比如&)导致脚本失效的问题。你尝试了多种转义方式(\&、&amp;、&#38;、encodeURIComponent、%26)都没解决,移除&后脚本正常运行,其他特殊字符(引号、<、>)也会引发同样问题。

你的原代码:

var filterXml = "&lt;filter type='and'&gt;&lt;condition attribute='my_variantstatus' operator='ne' value='R&amp;amp;D stage'/&gt;&lt;condition attribute='my_variantstatus' operator='ne' value='Discontinued'/&gt;&lt;/filter&gt;";

问题分析

你当前代码里的R&amp;amp;D stage是双重转义导致的错误——XML中&需要转义为&amp;,但你在JavaScript字符串里又把&重复转义成了&amp;,最终传递给Dynamics 365的是R&amp;D stage而非实际需要的R&D stage,自然匹配不到数据。另外,手动拼接XML字符串很容易在特殊字符转义上出错,尤其是同时处理JavaScript字符串转义和XML实体转义时。

解决方案

这里提供两种可靠的处理方式:

方式1:修正手动拼接的字符串转义

直接在XML中使用正确的XML实体转义,JavaScript字符串里只需处理XML的<和>为&lt;和&gt;,&只需要转义一次为&amp;:

// 正确的filterXml写法
var filterXml = "&lt;filter type='and'&gt;&lt;condition attribute='my_variantstatus' operator='ne' value='R&amp;D stage'/&gt;&lt;condition attribute='my_variantstatus' operator='ne' value='Discontinued'/&gt;&lt;/filter&gt;";

这样最终解析后的XML中,value属性值就是R&D stage,能正确匹配目标数据。

方式2:用DOM API构建XML(推荐)

手动拼接字符串容易出错,用原生DOM API创建XML节点可以自动处理特殊字符转义,彻底避免这类问题:

// 创建XML文档
var xmlDoc = document.implementation.createDocument("", "", null);

// 创建filter节点
var filterNode = xmlDoc.createElement("filter");
filterNode.setAttribute("type", "and");

// 创建第一个condition节点(排除R&D Stage)
var cond1 = xmlDoc.createElement("condition");
cond1.setAttribute("attribute", "my_variantstatus");
cond1.setAttribute("operator", "ne");
cond1.setAttribute("value", "R&D stage"); // 直接写原始值,DOM自动转义
filterNode.appendChild(cond1);

// 创建第二个condition节点(排除Discontinued)
var cond2 = xmlDoc.createElement("condition");
cond2.setAttribute("attribute", "my_variantstatus");
cond2.setAttribute("operator", "ne");
cond2.setAttribute("value", "Discontinued");
filterNode.appendChild(cond2);

// 将节点转换为字符串
var filterXml = new XMLSerializer().serializeToString(filterNode);

这种方式不需要手动处理任何转义,所有特殊字符都会被XMLSerializer自动转换成正确的XML实体,完全避免人为出错。

验证要点

  • 用方式1时,确保value里的&只转义一次为&amp;,不要重复转义
  • 用方式2时,直接传入原始值(如"R&D stage")即可,DOM会自动处理转义
  • 测试其他特殊字符(如引号、<、>)时,方式2同样适用,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:25:18