Delphi中IXMLDOMDocument2无法加载含%的XML文件,如何解决?
解决IXMLDOMDocument2加载含%符号XML文件的问题
问题原因
IXMLDOMDocument的load方法会将传入的文件路径当作URL解析,而%是URL中的转义符,未转义的%会被判定为不完整的转义序列,导致路径解析失败,无法找到目标文件。
解决方案
1. 对文件名中的%进行URL转义
将路径里的%替换为URL转义后的%25,再传入load方法:
' VBScript示例 Dim xmlDoc, rawPath, encodedPath Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0") rawPath = "C:\docs\test%sample.xml" ' 替换%为URL转义值%25 encodedPath = Replace(rawPath, "%", "%25") xmlDoc.async = False If xmlDoc.Load(encodedPath) Then ' 加载成功后的处理逻辑 Else WScript.Echo "加载失败: " & xmlDoc.parseError.reason End If
2. 使用file:///协议前缀并转义%
给本地路径加上file:///前缀,同时转义%为%25,明确告诉解析器这是本地文件路径:
// C++示例 _bstr_t filePath = L"file:///C:/docs/test%25sample.xml"; IXMLDOMDocument2* pDoc = nullptr; CoCreateInstance(CLSID_DOMDocument60, nullptr, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&pDoc); VARIANT_BOOL loadSuccess; pDoc->load(filePath, &loadSuccess);
3. 先读取文件内容再用LoadXML加载
绕开路径解析环节,先通过文件IO读取XML内容到内存,再调用LoadXML方法加载:
// C++示例 #include <fstream> #include <string> #include <comutil.h> #include <msxml2.h> #pragma comment(lib, "comsuppw.lib") #pragma comment(lib, "msxml6.lib") int main() { CoInitialize(nullptr); IXMLDOMDocument2* pDoc = nullptr; CoCreateInstance(CLSID_DOMDocument60, nullptr, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&pDoc); // 读取文件内容 std::ifstream xmlFile("C:\\docs\\test%sample.xml"); std::string content((std::istreambuf_iterator<char>(xmlFile)), std::istreambuf_iterator<char>()); _bstr_t bstrContent(content.c_str()); // 加载内存中的XML内容 VARIANT_BOOL loadSuccess; pDoc->loadXML(bstrContent, &loadSuccess); if (loadSuccess == VARIANT_TRUE) { // 加载成功处理 } else { IXMLDOMParseError* pErr = nullptr; pDoc->get_parseError(&pErr); BSTR errReason; pErr->get_reason(&errReason); // 输出错误信息 SysFreeString(errReason); pErr->Release(); } pDoc->Release(); CoUninitialize(); return 0; }
内容的提问来源于stack exchange,提问作者Jian Li
相关产品推荐
相关产品推荐

