Comment puis-je accéder aux attributs de l'élément à partir d'un IXMLDOMNode?
Je suis en train de construire un DOM XML document en C++. Mon problème est le suivant: j'exécute une requête XPATH à partir d'un Élément dans mon Document, dont je sais qu'il sera de retour d'un autre Élément. Le elementPtr->selectSingleNode appel renvoie un IXMLDOMNode. Comment puis-je accéder aux attributs de ce nœud?
Partie de moi veut abattu le Nœud d'un Élément, mais je ne pouvais pas obtenir de la fonte de travail.
J'ai essayé
MSXML2::IXMLDOMElementPtr pParentElement;
pParentNode->QueryInterface(__uuidof(MSXML2::IXMLDOMElement),
(void**) &pParentElement);
Qui résultats dans l'erreur d'exécution suivant:
0x0057cc58 _com_error::`scalar deleting destructor'(unsigned int)
De l'autre route que j'ai essayé était simplement utiliser les nœuds:
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;
Cela ne parvient pas à "parentNode->get_attributes()".
Il me semble que je suis absent quelque chose; l'API ne doit pas être dur à utiliser.
--edit--
Ce que je manquait, c'était que le selectSingleNode appel n'était pas, me laissant avec un pointeur NULL. Vous ne pouvez pas appeler QueryInterface sur ce, vous ne pouvez pas appeler get_attributes sur elle 😛
J'ai choisi la réponse qui correspond à la question que j'ai demandé, pas la réponse qui m'a aidé à réaliser que je m'étais posé la mauvaise question.
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Je ne vois rien de mal avec ce que vous avez écrit.
La smart com pointeurs vous aidera à convertir s'ils peuvent, vous n'avez pas à écrire l'interface de requête vous-même.
À l'aide de la Ptr types est un peu pénible à mon avis, bien que le MSXML interface favorise.
Voici un equivelant exemple à l'aide d'ATL
L'autre tentative serait ressembler à...
Et c'est de la COM, c'est toujours difficile à utiliser en C++ 🙁
Je crois me souvenir que l'ATL pointeurs intelligents sont garantis de ne pas lever une exception alors que le Compilateur COM Classe de Soutien pourrait, sauf si vous utilisez raw_interfaces seulement. Donc, vous êtes censé utiliser l'ATL ceux à l'intérieur d'autres objets COM (ou je suppose que donner toutes les captures), et seul le compilateur dans le code client.
Je voudrais utiliser ATL pour apporter une aide dans la gestion de la durée de vie des objets et vous permet de vous libérer, en ajoutant supplémentaire de l'exception de sécurité. Il permet également d'effacer votre code en n'ayant pas toutes les "brutes" appels COM jonché autour.
OriginalL'auteur Greg Domjan
Comment avez-vous essayer de faire les humbles de IXMLDOMNode à IXMLDOMElement? Vous ne pouvez pas simplement utiliser un C++ en fonte pour cela, car c'est un objet COM: vous avez à utiliser QueryInterface().
Regardant votre QueryInterface() code, quelques réflexions:
La QueryInterface() l'appel n'est pas tout à fait raison, je pense: vous avez d'appeler AddRef() d'une manière ou d'une autre sur le retour de l'interface, et votre code ne sera pas. Comme une autre affiche noté, vous pouvez obtenir _com_ptr_t<> pour ce faire, vous:
Cela permettra, je l'espère, arrêter de que "destructeur de suppression scalaire" erreur est probablement causée par une AddRef()/Release() mis-match.
De toute façon, essayez de le ci-dessus et de voir si pParentElement est null ou pas. Si elle l'est, la prochaine chose que je vous suggère est d'appeler get_nodeType() sur pParentNode pour voir quelle sorte de nœud, il est vraiment. Cela peut donner un indice si la requête XPath n'est pas de revenir sur ce que vous attendez.
Vous avez m'a indiqué la source de mon problème; l'appel de QueryInterface était correct, mais mon pParentNode était nulle, comme le selectSingleNode échec de l'appel. Le pParentElement(pParentNode) est d'une bien belle façon de réaliser les humbles.
OriginalL'auteur DavidK