gpt4 book ai didi

c++ - MSXML 的 loadXML 甚至无法加载格式正确的 xml

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:57 26 4
gpt4 key购买 nike

我已经用 c++ 在 MSXML 之上编写了一个包装器。加载方法如下所示。代码的问题是有时无法加载格式正确的 xml。

在将 xml 作为字符串传递之前,我对 xmlns 进行了字符串搜索,并将所有出现的 xmlns 替换为 xmlns:dns。 在下面的代码中,我删除了 bom 字符。然后我尝试使用 MSXML loadXML 方法加载。如果加载成功,我将设置 namespace ,如代码所示。

 Class XmlDocument{

MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
....
}

// XmlDocument methods

void XmlDocument::Initialize()
{

CoInitialize(NULL);
HRESULT hr = spXMLDOM.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if ( FAILED(hr) )
{

throw "Unable to create MSXML:: DOMDocument object";
}

}

bool XmlDocument::LoadXml(const char* xmltext)
{

if(spXMLDOM != NULL)
{

char BOM[3] = {0xEF,0xBB,0xBF};
//detect unicode BOM character
if(strncmp(xmltext,BOM,sizeof(BOM)) == 0)
{
xmltext += 3;
}

VARIANT_BOOL bSuccess = spXMLDOM->loadXML(A2BSTR(xmltext));
if ( bSuccess == VARIANT_TRUE)
{
spXMLDOM->setProperty("SelectionNamespaces","xmlns:dns=\"http://www.w3.org/2005/Atom\"");

return true;
}
}
return false;

}

我尝试调试仍然无法弄清楚为什么有时 loadXML() 甚至无法加载格式正确的 xml。我在代码中做错了什么。非常感谢任何帮助。

谢谢杰兹

最佳答案

具体问题请引用Strings Passed to loadXML must be UTF-16 Encoded BSTRs .

总的来说,xml 解析器不是为内存中的字符串解析而设计的,例如loadXML不识别BOM,对编码有限制。相反,xml 解析器是为字节数组形式设计的,具有编码检测功能,这对于标准解析器至关重要。为了更好地利用 MSXML,请考虑从 IStream 或 Win32 文件加载。

关于c++ - MSXML 的 loadXML 甚至无法加载格式正确的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2109767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com