Dynamics 365 CRM中FetchXML含&等特殊字符的Lookup过滤失效问题
在Dynamics 365中用FetchXML过滤含特殊字符的字段(如&)的正确处理方式
你在JavaScript中通过FetchXML过滤Dynamics 365的自定义文本字段my_variantstatus,需要排除值为R&D Stage和Discontinued的产品,但遇到了特殊字符(比如&)导致脚本失效的问题。你尝试了多种转义方式(\&、&、&、encodeURIComponent、%26)都没解决,移除&后脚本正常运行,其他特殊字符(引号、<、>)也会引发同样问题。
你的原代码:
var filterXml = "<filter type='and'><condition attribute='my_variantstatus' operator='ne' value='R&amp;D stage'/><condition attribute='my_variantstatus' operator='ne' value='Discontinued'/></filter>";
问题分析
你当前代码里的R&amp;D stage是双重转义导致的错误——XML中&需要转义为&,但你在JavaScript字符串里又把&重复转义成了&,最终传递给Dynamics 365的是R&D stage而非实际需要的R&D stage,自然匹配不到数据。另外,手动拼接XML字符串很容易在特殊字符转义上出错,尤其是同时处理JavaScript字符串转义和XML实体转义时。
解决方案
这里提供两种可靠的处理方式:
方式1:修正手动拼接的字符串转义
直接在XML中使用正确的XML实体转义,JavaScript字符串里只需处理XML的<和>为<和>,&只需要转义一次为&:
// 正确的filterXml写法 var filterXml = "<filter type='and'><condition attribute='my_variantstatus' operator='ne' value='R&D stage'/><condition attribute='my_variantstatus' operator='ne' value='Discontinued'/></filter>";
这样最终解析后的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里的&只转义一次为&,不要重复转义 - 用方式2时,直接传入原始值(如
"R&D stage")即可,DOM会自动处理转义 - 测试其他特殊字符(如引号、<、>)时,方式2同样适用,无需额外处理
内容的提问来源于stack exchange,提问作者ThibC
相关产品推荐
相关产品推荐

