Wie kann ich Zugriff auf die Attribute eines Elements aus einer IXMLDOMNode?
Baue ich ein XML-DOM-Dokument in C++. Mein problem ist Folgendes: ich habe eine XPATH-Abfrage auszuführen von einem Element in meinem Dokument, die ich kenne, kehren ein weiteres Element. Die elementPtr->selectSingleNode-Aufruf gibt einen IXMLDOMNode. Wie kann ich Zugriff auf die Attribute dieses Knotens?
Teil von mir will niedergeschlagen den Knoten um ein Element, aber ich konnte nicht die Darsteller zu arbeiten.
Versuchte ich
MSXML2::IXMLDOMElementPtr pParentElement;
pParentNode->QueryInterface(__uuidof(MSXML2::IXMLDOMElement),
(void**) &pParentElement);
Die Ergebnisse in der folgenden runtime error:
0x0057cc58 _com_error::`scalar deleting destructor'(unsigned int)
Den anderen Weg, den ich versucht, war, nur mit Knoten:
MSXML2::IXMLDOMNodePtr pParentNode =
pParameterElement->selectSingleNode("parent");
MSXML2::IXMLDOMNamedNodeMap* pParentAttributes;
pParentNode->get_attributes(&pParentAttributes);
MSXML2::IXMLDOMNodePtr pCategoryNameNode =
pParentAttributes->getNamedItem("Category");
VARIANT value;
pCategoryNameNode->get_nodeValue(&value);
CString categoryName = value;
Diese nicht auf "parentNode->get_attributes()".
Wie es scheint, bin ich etwas fehlt; die API sollte nicht so schwer sein zu bedienen.
--edit--
Was mir fehlte, war, dass die selectSingleNode-Aufruf scheiterte, ließ mich mit einem NULL-Zeiger. Können Sie nicht, rufen Sie QueryInterface auf, dass weder können Sie Sie nennen get_attributes 😛
Die ich ausgewählt habe, die Antwort passt, dass die Frage, die ich fragte, nicht die Antwort, die mir geholfen, zu realisieren, dass ich gefragt habe die falsche Frage.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht sehen, nichts falsch mit dem, was Sie geschrieben haben.
Den smart com-Zeiger wird Ihnen helfen, zu konvertieren, wenn Sie können, Sie müssen nicht zu schreiben, die Abfrage-Schnittstelle selbst.
Mittels Ptr-Typen ist ein bisschen schmerzhaft, meiner Meinung nach, wenn Sie die MSXML-Schnittstelle bevorzugt.
Hier ist ein equivelant Beispiel mit ATL
Anderen Versuch Aussehen würde...
Und es ist COM, ist es immer schwer zu verwenden in C++ 🙁
Ich glaube mich zu erinnern, dass die ATL-smart-Pointer sind garantiert nicht eine exception werfen, in der Erwägung, dass der COM-compilerunterstützung-Klasse könnte, es sei denn, Sie verwenden raw_interfaces nur. So sind Sie gedacht, um die ATL-diejenigen, die in andere COM-Objekte (oder ich nehme an, liefern alle relevanten Fänge), und nur der compiler diejenigen, die im client-code.
Ich würde verwenden ATL zu geben, Hilfe in der Verwaltung der lifetime von Objekten und macht Sie sicher, dass Sie Sie befreien, indem einige zusätzliche exception-Sicherheit. Es löscht auch Sie Ihren code nicht für alle die 'raw' - COM-Aufrufe übersät herum.
InformationsquelleAutor Greg Domjan
Wie haben Sie versucht zu tun, die niedergeschlagen von IXMLDOMNode zu IXMLDOMElement? Man kann nicht einfach ein C++ cast, wie es ist ein COM-Objekt: du hast zu verwenden QueryInterface().
Blick auf Ihre QueryInterface () - code, einige Gedanken:
Die QueryInterface () - Aufruf ist nicht ganz richtig, denke ich: du hast zu rufen AddRef() die eine oder andere Weise auf die zurückgegebene Schnittstelle, und der code wird nicht. Wie ein anderer poster angemerkt, können Sie bekommen _com_ptr_t<> um dies für Sie tun:
Tun dies, ich hoffe, halt, dass "scalar deleting destructor" - Fehler, wahrscheinlich verursacht durch ein AddRef()/Release() mis-match.
Sowieso, versuchen, die oben und sehen, ob pParentElement null ist oder nicht. Wenn es ist, ist die nächste Sache, die ich vorschlagen würde ist den Aufruf get_nodeType() auf pParentNode, um zu sehen, welche Art von Knoten es wirklich ist. Dies könnte einen Anhaltspunkt geben, ob der XPath nicht das zurück, was Sie erwarten.
Sie habe, wies mich auf die Quelle meines Problems; der QueryInterface-Aufruf korrekt war, aber meine pParentNode war null, wie die selectSingleNode-Aufruf fehlgeschlagen. Die pParentElement(pParentNode) - Aufruf ist eine viel schönere Art und Weise der Durchführung der niedergeschlagenen obwohl.
InformationsquelleAutor DavidK