Thread View: fr.comp.text.xml
2 messages
2 total messages
Started by Jean-Philippe BRUNET
Sun, 15 Oct 2000 06:25
"Caster" une interface "node" en interface "element" dans le DOM microsoft?
Author: Jean-Philippe BRUNET
Date: Sun, 15 Oct 2000 06:25
Date: Sun, 15 Oct 2000 06:25
56 lines
3187 bytes
3187 bytes
Je travaille en C++ en environnement Microsoft.
Quelqu'un sait-il comment on peut r�cup�rer une interface
MSXML2::IXMLDOMElement � partir d'une interface MSXML2::IXMLDOMNode bien sur
quand le "node" est un "�l�ment".
La doc dit que IXMLDOMElement h�rite deIXMLDOMNode mais je ne connais pas
la formule magique pour "caster" un objet interface en un autre (un "cast"
C++ standard crashe m�chamment).
Voici le bout de source concern�:
///************************************************
XML SOURCE
///************************************************
<root>
<table>
<line>xxx</line>
<line>yyy</line>
<line>zzz</line>
</table>
<table>
<line>aaa</line>
<line>bbb</line>
<line>ccc</line>
</table>
</root>
///****************************************************************
C++ SOURCE
///****************************************************************
../..
HRESULT hr;
bstr_t str = "/root/table";
MSXML2::IXMLDOMNodeList *list ;
MSXML2::IXMLDOMNode *item ;
MSXML2::IXMLDOMElement *element ;
hr= m_XmlDom->selectNodes(str,&list);
ASSERT(hr== S_OK) ;
long len ;
list->get_length(&len) ;// V�rifie que l'on a deux tables
for(int i=0;hr== S_OK && i< len ;i++){ // Accede aux deux tables
successivement
BSTR src ;
hr = list->get_item(i,&item);// R�cup�re un NODE, tout va bien
ASSERT(hr== S_OK) ;
hr= item->get_nodeType(&nodeType);// Verifie que le node est bien un
�l�ment, ca va toujours
ASSERT(hr== S_OK) ;
ASSERT(nodeType == NODE_ELEMENT);
//********************************************************
// ***** A partir de l�, je d�croche, il faudrait r�cup�rer l'�l�ment.
HELP!****
//********************************************************
// j'ai essay� histoire de rigoler
// element = (MSXML2::IXMLDOMElement *) item ;
//Ca plante violent
// Que faire en fait. il doit bien exister une formule magique pour
"caster" une interface dans un de ses descendants
//ou une facon en DOM de reconstruire un �l�ment existant.
Re: "Caster" une interface "node" en interface "element" dans le DOM microsoft?
Author: Mathieu Poumeyrol
Date: Mon, 16 Oct 2000 00:00
Date: Mon, 16 Oct 2000 00:00
56 lines
3262 bytes
3262 bytes
Bon, c'est pas vraiment une question XML, mais je vais repondre quand meme...
On Sun, 15 Oct 2000 08:25:23 +0200,
Jean-Philippe BRUNET <jean-philippe.brunet@libertysurf.fr> wrote:
>Je travaille en C++ en environnement Microsoft.
>Quelqu'un sait-il comment on peut r�cup�rer une interface
>MSXML2::IXMLDOMElement � partir d'une interface MSXML2::IXMLDOMNode bien sur
>quand le "node" est un "�l�ment".
>La doc dit que IXMLDOMElement h�rite deIXMLDOMNode mais je ne connais pas
>la formule magique pour "caster" un objet interface en un autre (un "cast"
>C++ standard crashe m�chamment).
>
>HRESULT hr;
>bstr_t str = "/root/table";
> MSXML2::IXMLDOMNodeList *list ;
> MSXML2::IXMLDOMNode *item ;
> MSXML2::IXMLDOMElement *element ;
> hr= m_XmlDom->selectNodes(str,&list);
> ASSERT(hr== S_OK) ;
> long len ;
> list->get_length(&len) ;// V�rifie que l'on a deux tables
> for(int i=0;hr== S_OK && i< len ;i++){ // Accede aux deux tables
>successivement
> BSTR src ;
> hr = list->get_item(i,&item);// R�cup�re un NODE, tout va bien
> ASSERT(hr== S_OK) ;
> hr= item->get_nodeType(&nodeType);// Verifie que le node est bien un
>�l�ment, ca va toujours
> ASSERT(hr== S_OK) ;
> ASSERT(nodeType == NODE_ELEMENT);
> //********************************************************
> // ***** A partir de l�, je d�croche, il faudrait r�cup�rer l'�l�ment.
>HELP!****
> //********************************************************
> // j'ai essay� histoire de rigoler
> // element = (MSXML2::IXMLDOMElement *) item ;
> //Ca plante violent
> // Que faire en fait. il doit bien exister une formule magique pour
>"caster" une interface dans un de ses descendants
> //ou une facon en DOM de reconstruire un �l�ment existant.
ce sont des objets COM, il faut donc utiliser QueryInterface pour caster
essayes quelque chose du genre (de tete, hein, je suis pas sur que ca
compile en l'etat)
hr = item->QueryInterface(__uuidof(IXMLDOMElement), (void**)&element);
Je te conseille aussi d'utiliser
ASSERT(SUCCEEDED(hr)) plutot que ASSERT(hr == S_OK);
Enfin lorsqu'on veut down-caster des object C++, il est preferable d'utiliser
le cast dynamique au lieu du cast statique (mais pour les objets COM, le
query interface est obligatoire).
--
Mathieu Poumeyrol
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads