Hi Jason,

That would be great, thanks (if it doesn't cost you too much time that
is). 
About the Xerces-C-3.0-beta, do I need to download this from
http://xml.apache.org/dist/xerces-c/experimental/archives/tru64/xerces-c
-src1_3_0-OSF1.tar.gz and build it ?

Thanks for all your help,

Ben 

-----Oorspronkelijk bericht-----
Van: Jason Stewart [mailto:[EMAIL PROTECTED] 
Verzonden: woensdag 16 augustus 2006 10:04
Aan: [email protected]
Onderwerp: Re: Accessing Xerces Perl object's from C++.

Hi Ben,

On 8/16/06, Ben Meijering <[EMAIL PROTECTED]> wrote:
> I am building an XML parser in C++. The manner in which a document is 
> parsed is defined in a XML document, where handler functions are 
> defined for certain tags and attributes.
>
> These functions are registered in a function repository beforehand and

> can be of any kind, for now only C++ and Perl. These functions have 
> Xerces objects as arguments. I could stick solely to C++ functions, 
> but I figured if Xerces had a similar construction just like wxPerl 
> has, this could be a nice addition to my application.

OK, I got a better picture of what you're doing, thanks.

No one has asked for this feature before. It is relatively trivial -
since Xerces-Perl has to do this same action at ever method invocation,
but there isn't a simple method for it. The reason for this is that you
have to know what type the object is - and that type is given as a SWIG
type_info struct (since Xerces-Perl is created by wrapping Xerces-C
using SWIG). That type_info struct is very version dependent and would
not work across different releases of Xerces-Perl.

So for example:

     res3 = SWIG_ConvertPtr(ST(1), &argp3, SWIGTYPE_p__XMLGrammarPool, 0
|  0 );
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '"
"new_XercesDOMParser" "', argument " "3"" of type '" "XMLGrammarPool
*const""'");
    }
    arg3 = reinterpret_cast<XMLGrammarPool * >(argp3);

would take the the perl SV* sitting in ST(1) - the second var on the
stack - and convert it to an void* into the var argp3. If res3 is OK -
meaning all the error checking worked, then you can safely do the cast
of argp3 to arg3 with all the type information.

but you see - you need access to that 'SWIGTYPE_p__XMLGrammarPool'
pointer, which at the moment is compiled into Xerces.cpp and not
accessible from a header file.

I have wanting to do that for many years, but I have never had the
reason to spend the time to make it work. If you are sufficiently
motivated, I will put aside some time and get it working if you are will
to test it with Xerces-C-3.0-beta (I'm no longer updating older versions
of Xerces-Perl).

Cheers, jas.

Reply via email to