私はC++でMSXMLの上にラッパーを書きました。ロード方法は以下のようになります。コードの問題は、整形式のxmlをロードできない場合があることです。
xmlを文字列として渡す前に、xmlnsの文字列検索を実行し、出現するすべてのxmlnsをxmlns:dnsに置き換えます。以下のコードでは、bom文字を削除しています。次に、MSXMLloadXMLメソッドを使用してロードしようとします。ロードが成功した場合、コードに示されているように名前空間を設定します。
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()が整形式のxmlでさえロードできないことがある理由を理解できませんでした。コードで何が間違っているのですか。どんな助けでも大歓迎です。
ありがとうJeeZ