You need to enable JavaScript to run this app. Delphi中调用IXMLDomDocument.LoadXML()替换#13#10后仍报无效字符#$D#$A问题
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中调用IXMLDomDocument.LoadXML()替换#13#10后仍报无效字符#$D#$A问题

问题根因

你当前的替换逻辑没有覆盖全所有触发报错的场景,存在两个明确漏洞:

  • 仅匹配了连续成对出现的回车换行组合#13#10,完全遗漏了散落在字符串任意位置的独立#13(回车)、独立#10(换行),这些残留的ASCII控制字符就是XML解析器报出无效字符的直接原因。
  • 代码中顺序调用OleDoc.parseError.linepos这类属性、不做实际接收/判断的写法没有任何实际作用,这些是只读属性,单独调用不会产生任何处理逻辑。
  • 内置Trim()方法只会清理字符串首尾的空白字符,无法处理字符串内部夹杂的控制字符,和你想清理换行的目标不匹配。

修正后的可运行实现

把替换逻辑调整为全量清除所有独立的回车、换行字符,同时集中处理解析错误的读取逻辑:

OleDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
try
  // 全量清除所有位置的独立回车、换行,避免遗漏散在文本中间的控制字符
  WideDecoded := StringReplace(WideDecoded, #13, '', [rfReplaceAll]);
  WideDecoded := StringReplace(WideDecoded, #10, '', [rfReplaceAll]);
  WideDecoded := Trim(WideDecoded);
  OleDoc.loadXML(WideDecoded);
  // 统一读取解析错误信息,去掉无意义的零散属性调用
  if OleDoc.parseError.errorCode <> 0 then
    raise Exception.CreateFmt('XML 加载失败:%s(错误行:%d,错误位置:%d,错误片段:%s)', [
      OleDoc.parseError.reason,
      OleDoc.parseError.line,
      OleDoc.parseError.linepos,
      OleDoc.parseError.srcText
    ]);
finally
  OleDoc := nil;
end;

补充提示:如果调整后依然报同类无效字符错误,可以检查待解析字符串开头是否带了UTF-8 BOM对应的特殊控制字符,这类字符也会触发XMLDOM的解析校验失败,需要单独剥离字符串前3个字节对应的特殊值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 16:45:10