Delphi IXMLDOMDocument2 无法加载文件名中包含 % 的 XML 文件

Jia*_* Li 3 delphi msxml

我在将文件加载到IXMLDOMDocument2. 如果文件名包含并load设置为:False%parseError

系统找不到指定的资源。

%该文件存在,当从其名称中删除时,它工作得很好。

有什么方法可以加载%名称中包含的 XML 文件吗?

Pet*_*olf 5

的文档IXMLDOMDocument.load()表示xmlSource源参数接受以下值之一:

  • 包含 URL 的字符串
  • IStream
  • ISequentialStream
  • IPersistStream
  • SAFEARRAY字节数
  • 另一个IXMLDOMDocument例子

您正在尝试传递一个文件名,该方法将其视为 URL(上面列表中的第一个选项)。URL 中的字符%保留用于百分比编码。该IXMLDOMDocument.load()方法尝试从您作为参数传递的字符串中解码 URL,这可能会导致文件名略有不同。棘手的部分是,当百分比字符后面没有跟一对十六进制数字时,不会发生这种情况,这意味着:Test%.xml将被解码为Test%.xml,但Test%21.xml将被解码为Test!.xml,或Test%4A.xml将被解码为TestJ.xml

您应该小心传递给该IXMLDOMDocument.load()方法的内容。您有多种选择。

将文件名编码为 URL

这很容易。TNetEncoding.URL您可以从本机使用System.NetEncoding

var FileName := 'C:\test%21.xml';
var Doc := CoDOMDocument.Create;
Doc.load(TNetEncoding.URL.Encode(FileName));
Run Code Online (Sandbox Code Playgroud)

传递 anIStream作为参数:

TFileStream使用(或TFile.OpenRead()来自单元)打开文件System.IOUtils并将其包装在TStreamAdapter来自System.CLasses单元中,该单元实现了单元IStream中声明的接口Winapi.ActiveX

var FileName := 'C:\test%21.xml';
var Stream: IStream := TStreamAdapter.Create(TFile.OpenRead(FileName), soOwned);
var Doc := CoDOMDocument.Create;
Doc.load(Stream);
Run Code Online (Sandbox Code Playgroud)

请改用loadXML()以下方法:

有一种IXMLDOMDOcument.loadXML()方法允许您从字符串加载 XML 内容。您可以使用TFile.ReadAllText()(unit System.IOUtils) 读取文件的内容并将其传递给loadXML()方法。

var FileName := 'C:\test%21.xml';
var Doc := CoDOMDocument.Create;
Doc.loadXML(TFile.ReadAllText(FileName));
Run Code Online (Sandbox Code Playgroud)

我不建议使用此选项加载 XML,因为它将文件的全部内容加载到内存中。