यह वास्तव में एक प्रश्न नहीं है क्योंकि मुझे पहले से ही एक समाधान मिला है। मुझे बहुत समय लगा, इसलिए मैं इसे यहां समझाऊंगा।पागल बनने के बिना विजुअल स्टूडियो 2008 एक्सप्रेस (कोई एटीएल कक्षाएं) के साथ msxml का उपयोग कैसे करें?
एमएसएक्सएमएल COM पर आधारित है, इसलिए सी ++ में उपयोग करना वास्तव में आसान नहीं है जब भी आपके पास स्मृति आवंटन समस्याओं से निपटने के लिए उपयोगी कक्षाएं हों। लेकिन एक नया एक्सएमएल पार्सर लिखना बहुत मुश्किल होगा इसलिए मैं msxml का उपयोग करना चाहता था।
समस्या:
मैं CComPtr
की मदद से msxml उपयोग करने के लिए (स्मार्ट सूचक मैन्युअल रूप से प्रत्येक IXMLDOMNode के लिए रिलीज() कॉल करने के लिए होने से बचने के लिए), CComBSTR
इंटरनेट पर पर्याप्त उदाहरण खोजने के लिए सक्षम था (तारों के लिए COM प्रारूप में सी ++ तारों को परिवर्तित करने के लिए) और CComVariant
। यह 3 सहायक वर्ग एटीएल कक्षाएं हैं और #include <atlbase.h>
की आवश्यकता है।
समस्या: विजुअल स्टूडियो 2008 एक्सप्रेस (मुफ़्त संस्करण) में एटीएल शामिल नहीं है।
समाधान:
उपयोग comutil.h
और comdef.h
, जो कुछ सरल सहायक वर्गों में शामिल हैं:
_bstr_t
बदल देता है और अधिक या कमCComBSTR
_variant_t
बदल देता है और अधिक या कमCComVariant
_com_ptr_t
की जगह परोक्ष रूप सेCComPtr
_COM_SMARTPTR_TYPEDEF
छोटे उदाहरण के उपयोग के माध्यम:
#include <msxml.h>
#include <comdef.h>
#include <comutil.h>
// Define some smart pointers for MSXML
_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument, __uuidof(IXMLDOMDocument)); // IXMLDOMDocumentPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement)); // IXMLDOMElementPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList, __uuidof(IXMLDOMNodeList)); // IXMLDOMNodeListPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNamedNodeMap, __uuidof(IXMLDOMNamedNodeMap)); // IXMLDOMNamedNodeMapPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNode, __uuidof(IXMLDOMNode)); // IXMLDOMNodePtr
void test_msxml()
{
// This program will use COM
CoInitializeEx(NULL, COINIT_MULTITHREADED);
{
// Create parser
IXMLDOMDocumentPtr pXMLDoc;
HRESULT hr = CoCreateInstance(__uuidof (DOMDocument), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pXMLDoc);
pXMLDoc->put_validateOnParse(VARIANT_FALSE);
pXMLDoc->put_resolveExternals(VARIANT_FALSE);
pXMLDoc->put_preserveWhiteSpace(VARIANT_FALSE);
// Open file
VARIANT_BOOL bLoadOk;
std::wstring sfilename = L"testfile.xml";
hr = pXMLDoc->load(_variant_t(sfilename.c_str()), &bLoadOk);
// Search for node <testtag>
IXMLDOMNodePtr pNode;
hr = pXMLDoc->selectSingleNode(_bstr_t(L"testtag"), &pNode);
// Read something
_bstr_t bstrText;
hr = pNode->get_text(bstrText.GetAddress());
std::string sSomething = bstrText;
}
// I'm finished with COM
// (Don't call before all IXMLDOMNodePtr are out of scope)
CoUninitialize();
}
वीएस -2008 एक्सप्रेस में एटीएल शामिल नहीं है? वह बेकार है। > :( –