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
相关产品推荐
相关产品推荐

