XML & C++
-
also arbeite mit Microsoft Visual Studio 6.0 Professional.
wenn es von bedeutung ist... ich arbeite auf ner virtuellen maschine (xp), da vs auf vista oft genug "hängen bleibt".
-
achso.. gleich noch ne frage hinterher: ich soll ja die funktionen zum auslesen der xml datei in ner dll bereitstellen, die dann auf anderen rechnern als meinem eingesetzt werden. muss dann auf denen auch msxml installiert sein? oder ist das überflüssig, da die dll ja fertig kompiliert ist.
sry für die frage... *peinlich*
-
Hallo M@tt!
Leg am besten ein neues leeres Konsolen-Projekt an und nimm ides als Hauptdatei.
Ich krigs zur Zeit nur als MBCS linked; kannst ja mal schauen ob VC 6 das auch als UNICODE hinkriegt.Grüsse
*this
EDIT
P.S:Ja, die MSXML?.dll muss da schon installiert sein, aber irgendeine sollte heutzutage eigentlich da sein. Sag ich mal so...
Aber trotzdem: immer Vorsicht bei Versionsthemen !
/EDIT/* * @name COMDriver.cpp * * @brief Simple Demo for using MSXML/DOM with C++/ATL * @brief Prints an xml foo.xml in working dir * * @author Gast++ * @ref http://www.c-plusplus.net/forum/viewtopic-var-p-is-1277772.html#1277772 * @created May 2nd 2007 * @known_bugs badly documented an poor error-handled * @licence Public Domain - copy as you like it ;-) * @warranty None! * */ #define STRICT #ifndef WINVER // Allow use of features specific to Windows XP or later. #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. #define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. #endif #ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. #define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. #endif #define _ATL_FREE_THREADED #include <iostream> #ifdef _UNICODE typedef std::wstring string; typedef std::wostream ostream; typedef std::wistream istream; ostream& cout = std::wcout; ostream& cerr = std::wcerr; ostream& clog = std::wclog; istream& cin = std::wcin; #else // _MBCS, SBCS typedef std::string string; typedef std::ostream ostream; typedef std::istream istream; ostream& cout = std::cout; ostream& cerr = std::cerr; ostream& clog = std::clog; istream& cin = std::cin; #endif // #ifdef _UNICODE #include <atlbase.h> #include <tchar.h> #import <msxml4.dll> // or the current version const string strXMLFileName = _T("foo.xml"); /* * Prints Attributes of a given node; * takes Node and idnent width as args */ void attrDump(MSXML2::IXMLDOMNodePtr& pNode, unsigned int nTabs = 0) { if(pNode != NULL) { MSXML2::IXMLDOMNamedNodeMapPtr& pAttrList = pNode->attributes; if (pAttrList!= NULL) { for (register unsigned int i = 0; i < nTabs; ++i) { cout << _T("\t"); } for ( MSXML2::IXMLDOMAttributePtr pAttr = pAttrList->nextNode(); pAttr != NULL; pAttr = pAttrList->nextNode()) { cout << _T("#") << (TCHAR*)(pAttr->nodeName) << _T(" => ") << (TCHAR*)(pAttr->text) << _T("\t"); } cout << std::endl; } } } /* * Prints a xml node-tree in-order recursively * takes Node and indent width as args */ void depthDump(MSXML2::IXMLDOMNodePtr& pNode,unsigned int nTabs = 0) { for (register unsigned int i = 0; i < nTabs; ++i) { cout << _T("\t"); } cout << (TCHAR*)_bstr_t(pNode->nodeName) << std::endl; attrDump(pNode,nTabs); for (MSXML2::IXMLDOMNodePtr& pChild = pNode->firstChild; pChild != NULL; pChild = pChild->nextSibling) { depthDump(pChild, nTabs++); } } int _tmain(int argc, TCHAR* argv[]) { HRESULT hr = S_OK; if (SUCCEEDED(hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED))) { /* * Declaring here makes COM SmartPtr work for us: * * - They'll be c/dtor'ed outside any try..catch * thus AddRef'ing / Releasing the Pointers * * - dto before ::CoUninitialize() - exceptions are thrown * */ try { MSXML2::IXMLDOMDocument2Ptr pDoc("Msxml2.FreeThreadedDOMDocument"); pDoc->async = false; if (pDoc->load(::strXMLFileName.c_str())) { /* * Simply depth-searching the tree * and printing tags */ depthDump((MSXML2::IXMLDOMNodePtr)pDoc->documentElement); }; } catch (_com_error& e) { #pragma message("There can to be done MUCH more about Error Handling!") /* * especially by using this Ptr */ try { IErrorInfoPtr pErr(e.ErrorInfo(),false); /* This take sownership * of the received Pointer * "Destructive Copying" */ cerr << e.ErrorMessage() << std::endl; hr = e.Error(); } catch (...) { cerr << _T("Fatal: Unknown Error after Exception"); } } } else { // ::CoInitializeEx() // FormatMessage(...,hr...) cerr << _T("Fatal: Could not initalize COM! Exiting") << std::endl; } ::CoUninitialize(); // NULL return (int) hr; };
-
danke dir.....
also, was ich ändern musste ist dieses WINVER auf 0x0400 setzen, da es mir ansonsten fehler mit mit windows anzeigt. so, ansonsten hab ichs jetzte mehr oder weniger am laufen. weniger in dem sinne, dass beim kompilieren folgender fehler kommt:
--------------------Configuration: test - Win32 Debug-------------------- Compiling... test.cpp There can to be done MUCH more about Error Handling! test.obj - 1 error(s), 0 warning(s)wenn ich jedoch auf "build" gehe, kommt kein fehler, allerdings aber auch keine ausschrift in der konsole bis aus press any key to continue. die zu öffnende xml - datei hab ich auf meine geändert. logisch.
was mache ich falsch?
-
M@tt schrieb:
danke dir.....
You're welcome!
M@tt schrieb:
also, was ich ändern musste ist dieses WINVER auf 0x0400 setzen, da es mir ansonsten fehler mit mit windows anzeigt. so, ansonsten hab ichs jetzte mehr oder weniger am laufen. weniger in dem sinne, dass beim kompilieren folgender fehler kommt:
--------------------Configuration: test - Win32 Debug-------------------- Compiling... test.cpp There can to be done MUCH more about Error Handling! test.obj - 1 error(s), 0 warning(s)wenn ich jedoch auf "build" gehe, kommt kein fehler, allerdings aber auch keine ausschrift in der konsole bis aus press any key to continue. die zu öffnende xml - datei hab ich auf meine geändert. logisch.
was mache ich falsch?
Du machst gar nichts falsch; das #pragma ist eine Compilerdirektive; beim Linken (obj lib => exe ) interessiert das nicht mehr.
Warum die Meldung bei Dir als Error erscheint weiss ich nicht; das scheint ein Compiler-Schalter zu sein.
Das pragma war eh nur dazu dar um auf etwas hinzuweisen; kommentier's ggf. einfach aus.
Btw. _com_ptr_t solltest Du Dir vielleicht mal anschuen; das sind die SmartPtr die in dem Code verwandt werden; die kapseln AddRef() und Release().
Ausserdem sollest Du Dir vlt. auch mal anschauen wie OLE/COM ohne SmartPtr funken ( CoCreateInstance(), QueryInteface(), Invoke() ... ).
Pass in Deiner DLL auf Threading auf; OLE/COM sind nicht threadsicher - dafür muss Du selbst sorgen! Ein Interface* oder InterfacePtr ist nicht in einem anderen Thread gültig; es sei denn der läuft im selben COM-"Apartment" Stichworte ( MTA, STA ).Du könntest übrigens Deine DLL auch als (ATL)-COM-DLL auslegen; dann sollten die Anwender das natürlich auch so nutzen wollen.
Abgesehen davon dass m dem Code eh noch ein Fehler ist, bau ich da demnächst auch noch mal ein einfaches native OLE-Beispiel ein.
Grüsse
Gast++
P.S.:
P.P.S.: pre-order; nicht in-order isses
-
ok.... thx again!
aber wenn ich ehrlich bin... ich hab null verstanden. mit msxml ist das auch so ne sache für mich. von meinem auftragsgeber hab ich jetzt gesagt bekommen, dass ich xpath verwenden soll, aber eigentlich hab ich davon noch weniger ahnung. naja... übers netz findet man nich wirklich viel und die paar bücher, die ich mir heute aus ner bibliothek geholt habe werden bestimmt auch nicht der bringer sein.

anyway - thx an alle die versucht haben zu helfen.
-
M@tt schrieb:
ok.... thx again!
aber wenn ich ehrlich bin... ich hab null verstanden. mit msxml ist das auch so ne sache für mich. von meinem auftragsgeber hab ich jetzt gesagt bekommen, dass ich xpath verwenden soll,xpath ist kein anderer Parser; XPath ist eine "Sprache" zur Navigation in XML Bäumen.
Ist im MSXML SDK beshrieben.M@tt schrieb:
aber eigentlich hab ich davon noch weniger ahnung. naja... übers netz findet man nich wirklich viel und die paar bücher, die ich mir heute aus ner bibliothek geholt habe werden bestimmt auch nicht der bringer sein.

anyway - thx an alle die versucht haben zu helfen.
Nimm's mir die Frage bitte nicht übel, aber warum ziehst Du Dir solch einen Auftrag an Land?
=> Mach einen Ausghang ans schwarze Brett im nächsten FB Informatik, such Dir so Hilfe und teil die Knete! <=Grüsse
*this
-
naja auftrag mehr oder weniger.... das ist 'n praktikum (bei siemens, kann man ja sagen), was teil einer schulischen ausbildung ist. freie wahl war es eigentlich weniger, denn ausweichen auf einen anderen betrieb konnte ich nicht. einzig und allein aus dem grund, da es hier (görlitz - kleines kaff in ostsachsen), nicht viele it-betriebe gibt, die praktikanten gesucht haben. naja egal.
wie auch immer... also wie ich dir entnehme bringt mir dieses xpath in bezug auf xml - dateien auslesen, rein gar nichts. naja ok, dann werd ich mich halt weiter an msxml und diversern parsern versuchen müssen.
-
Also ich würde mal in Literatur investieren. Anstatt hier rumzugurken. Meine Meinung.
-
nicht alles gelesen, aber kann es sein ,dass du keine ahnung hast was xml knoten usw. sind?
-
Artchi schrieb:
Also ich würde mal in Literatur investieren. Anstatt hier rumzugurken. Meine Meinung.
wer lesen kann ist klar im vorteil
ich hab schrieb:
nicht alles gelesen, aber kann es sein ,dass du keine ahnung hast was xml knoten usw. sind?
naja nicht so wirklich... also was die knoten sind weiß ich so ungefähr, aber ich würde nicht sagen, dass ich mich besonders mit xml auskenne.