"John Utz" <[EMAIL PROTECTED]> writes:
> here is the current place that i am stuck:
>
> die "Non schema grammar, no output available\n"
> if( $saxParser->getValidator()->getGrammar()->getGrammarType() !=
> $XML::Xerces::Grammar::SchemaGrammarType );
>
> my $grammar = $saxParser->getValidator()->getGrammar();
> print "GRAMMAR: $grammar\n";
>
> my $elemEnum = $grammar->getElemEnumerator(); #barfs here
>
> bash-2.04$ perl SEnumval.pl
> /sfusers/utz/Compile/xerces-c-src1_6_0/samples/data/personal-schema.xml
> GRAMMAR: XML::Xerces::Grammar=HASH(0x84871e0)
> Can't locate auto/XML/Xerces/Grammar/getElemEnum.al in @INC (@INC
> contains: /usr/local/lib/perl5/5.6.1/i686-linux /usr/local/lib/perl5/5.6.1
> /usr/local/lib/perl5/site_perl/5.6.1/i686-linux
> /usr/local/lib/perl5/site_perl/5.6.1 /usr/local/lib/perl5/site_perl .) at
> SEnumval.pl line 43
>
> but here is the dang call in the Xeces.pm that i created this morning:
>
> ############# Class : XML::Xerces::SchemaGrammar ##############
>
> package XML::Xerces::SchemaGrammar;
> @ISA = qw( XML::Xerces XML::Xerces::Grammar );
> %OWNER = ();
> <snip>
> *getGrammarType = *XML::Xercesc::SchemaGrammar_getGrammarType;
> <snip>
> *getElemEnumerator = *XML::Xercesc::SchemaGrammar_getElemEnumerator;
>
> getGrammarType works, getElemEnumerator doesnt, what else might i be doing
> wrong?
Ok. You're getting bitten by the SWIG-casts-things-to-the-base-class
problem. Look at the class of the object your code printed out:
GRAMMAR: XML::Xerces::Grammar=HASH(0x84871e0)
It's an XML::Xerces::Grammar instance *not* a
XML::Xerces::SchemaGrammar instance. So it's looking in the
XML::Xerces::Grammar namespace for a method called getElemEnumerator()
and not finding one...
You can't blame swig, because the method it was wrapping has a
signature that says it returns a Grammar instance, so it has to bless
the object into some class, so it hard-codes in the base class name
XML::Xerces::Grammar into the bless command.
The way we get around this for the other class hierarchies is to use a
method called actual_cast() to re-bless the object into the
appropriate subclass:
package XML::Xerces::DOM_Node;
sub actual_cast {
return undef unless _isa( ref($_[0]), 'XML::Xerces::DOM_Node' );
return $_[0] if $_[0]->isNull;
my $node_type = $_[0]->getNodeType;
return _reinterpret_cast('XML::Xerces::DOM_Text', $_[0])
if $node_type == $XML::Xerces::DOM_Node::TEXT_NODE;
return _reinterpret_cast('XML::Xerces::DOM_ProcessingInstruction', $_[0])
if $node_type == $XML::Xerces::DOM_Node::PROCESSING_INSTRUCTION_NODE;
return _reinterpret_cast('XML::Xerces::DOM_Document', $_[0])
if $node_type == $XML::Xerces::DOM_Node::DOCUMENT_NODE;
.
.
.
}
sub _reinterpret_cast {
return undef unless ref $_[1];
bless $_[1], $_[0];
my($raw_ref, $tied) = ($_[1] =~ m[=(.*)\(]);
if ($raw_ref eq 'SCALAR') { $tied = tied ${$_[1]}; }
elsif ($raw_ref eq 'ARRAY') { $tied = tied @{$_[1]}; }
elsif ($raw_ref eq 'HASH') { $tied = tied %{$_[1]}; }
return $_[1] unless $tied;
bless $tied, $_[0];
return $_[1];
};
You could do something similar for the Grammar classes. Just stick the
extra code you want into postModule.pl, and it will insert it into
Xerces.pm whenever SWIG re-makes the code.
jas.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]