Ich habe einen Wrapper auf MSXML in C++ geschrieben. Die Lademethode sieht wie folgt aus. Das Problem mit dem Code ist es scheitert gut gebildet xml manchmal zu laden.
Bevor ich die xml als String übergebe, führe ich eine Stringsuche nach xmlns durch und ersetze alle Vorkommen von xmlns durch xmlns:dns. Im folgenden Code entferne ich das Zeichen bom. Dann versuche ich mit der MSXML loadXML Methode zu laden. Wenn das Laden erfolgreich ist, setze ich den Namespace wie im Code gezeigt.
Class XmlDocument{
MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
....
}
// XmlDocument-Methoden
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;
}
Ich habe versucht zu debuggen, konnte aber nicht herausfinden, warum loadXML() manchmal nicht einmal gut geformte XML-Dateien laden kann. Was mache ich falsch im Code. Jede Hilfe ist sehr zu schätzen.
Danke JeeZ