XElement值包含冒号时无法生成XML问题求助
问题解决思路
首先纠正一个基础认知错误:XML的文本节点/属性值本身完全支持冒号、百分号等字符,你遇到的名称中不能包含冒号报错,和runInfo.FieldValue的取值没有任何关系,之前的排查方向有误。
报错真实原因
报错信息明确指向「XML名称(元素名/属性名)包含非法字符」,对应你代码里的两处动态名称拼接逻辑:
// 1. xsi:type属性值是sf:xxx格式,属于属性值,不会触发报错 new XAttribute(xsiNs + "type", "sf:" + runInfo.RecordType) // 2. 动态生成元素名,这里如果runInfo.Field的取值包含冒号,就会直接触发报错 new XElement(sfNs + runInfo.Field, runInfo.FieldValue)
你可以通过以下代码快速验证:
// 直接把带冒号的字符串作为元素值,运行不会有任何报错 XDocument testDoc = new XDocument( new XElement("TestRoot", "Opportunity:006i000000sidsh;Account:;userId:a016S00000sjsiq;sandbox:true") ); Console.WriteLine(testDoc.ToString());
解决方案
- 先检查
runInfo.Field的赋值逻辑:Salesforce标准/自定义字段的API名称本身不允许包含冒号,大概率是上游逻辑把字段值错误赋值给了字段名变量,或者字段名拼接逻辑出错,修正该赋值问题即可解决报错。 - 如果业务确实需要将带冒号的标识作为内容存储,直接放在元素值中即可,XDocument会自动处理XML合法转义,不需要额外做URL编码(URL编码是给HTTP URL场景用的,不适合XML文本场景)。
- 如果确实有特殊场景需要在元素名中使用冒号格式的命名空间前缀,不要直接在名称字符串里加冒号,通过
XNamespace关联命名空间即可,XDocument生成XML时会自动生成符合规范的前缀映射。
内容的提问来源于stack exchange,提问作者so cal cheesehead
相关产品推荐
相关产品推荐

