Я написал оболочку над MSXML на c ++. Метод загрузки выглядит следующим образом.
Проблема с кодом в том, что он иногда не может загрузить правильно сформированный xml.
Перед передачей xml в виде строки я выполняю поиск строки для xmlns и заменяю все вхождения xmlns на xmlns: dns.
В приведенном ниже коде я удаляю символ bom. Затем я пытаюсь загрузить, используя метод MSXML loadXML. Если загрузка прошла успешно, я устанавливаю пространство имен, как показано в коде.
Class XmlDocument{
MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
....
}
// Методы XmlDocument
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 () не может загрузить даже правильно сформированные xmls. Что я делаю не так в коде. Любая помощь с благодарностью.
Спасибо
Jeez