MSXML';s loadXML即使格式良好的xml也无法加载 我在C++中在MSXML之上写了一个包装器。加载方法如下所示。 代码的问题是有时无法加载格式良好的xml
在将xml作为字符串传递之前,我对xmlns进行字符串搜索,并用xmlns:dns替换所有出现的xmlns。 在下面的代码中,我删除了bom字符。然后,我尝试使用MSXML loadXML方法进行加载。如果加载成功,我将按照代码所示设置名称空间MSXML';s loadXML即使格式良好的xml也无法加载 我在C++中在MSXML之上写了一个包装器。加载方法如下所示。 代码的问题是有时无法加载格式良好的xml,c++,msxml,C++,Msxml,在将xml作为字符串传递之前,我对xmlns进行字符串搜索,并用xmlns:dns替换所有出现的xmlns。 在下面的代码中,我删除了bom字符。然后,我尝试使用MSXML loadXML方法进行加载。如果加载成功,我将按照代码所示设置名称空间 Class XmlDocument{ MSXML2::IXMLDOMDocument2Ptr spXMLDOM; .... } //XmlDocument方法 我试着调试,但仍然不明白为什么有时loadX
Class XmlDocument{
MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
....
}
//XmlDocument方法
我试着调试,但仍然不明白为什么有时loadXML()甚至无法加载格式良好的XML。我在代码中做错了什么。非常感谢您的帮助
谢谢
天啊,我不是一个2BSTR的粉丝-至少你在泄漏内存,因为返回的BSTR永远不会被释放 你也可以很容易地做到
VARIANT_BOOL bSuccess = spXMLDOM->loadXML(CComBSTR(xmltext));
这将正确处理内存
至于它失败的原因-您可以向DOMDocument询问其parseError对象IXMLDOMParseError,然后从中获取原因-这可能会进一步说明真正的问题所在。有关此特定问题,请参阅 总的来说,xml解析器不是为内存中的字符串解析而设计的,例如loadXML不识别BOM,并且它对编码有限制。相反,xml解析器是为具有编码检测的字节数组形式设计的,这对于标准解析器来说是至关重要的。为了更好地利用MSXML,请考虑从iStRAMM或Win32文件加载。
我们使用
hr = m_pXMLDoc->load(_variant_t(xml_file.c_str()), &varStatus);
hr = m_pXMLDoc->loadXML(_bstr_t(xml_doc.c_str()), &varStatus);
分别加载文件和原始xml。感谢Ruddy的启发,我不知道A2BSTR会导致内存泄漏,从现在起将使用CComBSTR。我将按照你提到的那样做,并试图找出原因。与你的问题并不完全相关:我试图围绕MSXML编写一个包装器,但最终放弃了,在遇到类似的问题后,我直接使用了MSXML。
VARIANT_BOOL bSuccess = spXMLDOM->loadXML(CComBSTR(xmltext));
hr = m_pXMLDoc->load(_variant_t(xml_file.c_str()), &varStatus);
hr = m_pXMLDoc->loadXML(_bstr_t(xml_doc.c_str()), &varStatus);