[xsd-users] Custom DOMLSParser

Carlos Wong carloswong54 at gmail.com
Tue Jul 5 18:25:16 EDT 2022


Just an update.

I was able to make the generated embedded schema work for both x86_64 and ARM platforms.

This was accomplished by passing the “-m32” option to gcc for xerces and the driver executable.

Effectively making the driver executable a 32-bit binary, which is not ideal for our use case.

Is there a way to make the embedded schema work for both x86_64 and ARM platforms, such that the executable remains a 64-bit binary?

Best regards,

Carlos

> On Jul 5, 2022, at 11:02 AM, Carlos Wong <carloswong54 at gmail.com> wrote:
> 
> Hi all,
> 
> I am running into a new issue where the embedded schema generated from xsdbin on a x86_64, does not work on a ARM processor. It produces the following error:
> 
> “unable to load schema: InputStream read ‘0’ is less than required ‘8192’”
> 
> If I generate the embedded schema from an ARM cross-compiled xsdbin, everything works fine on my ARM platform, but ceases to work on my x86 platform.
> 
> Is anyone aware of a way to make the embedded schema work on both ARM and x86_64?
> 
> Thank you,
> 
> Carlos
> 
>>> On Jun 8, 2022, at 11:02 AM, Carlos Wong <carloswong54 at gmail.com> wrote:
>>> 
>> 
>> Hi Boris,
>> 
>> Thank you for the prompt response.
>> 
>> It turns out my issue was resolved by calling the DOMLSParserImpl constructor from the initialization list.
>> 
>> I was calling it directly from the constructor body.
>> 
>> I will give your suggestion to directly create a custom_dom_LS_parser_impl a shot.
>> 
>> Thanks again,
>> 
>> Carlos
>> 
>>> On Wed, Jun 8, 2022 at 10:51 AM Boris Kolpackov <boris at codesynthesis.com> wrote:
>>> Carlos Wong <carloswong54 at gmail.com> writes:
>>> 
>>> > But I can only either make the embedded binary representation work or my
>>> > customer error handler. I have run out of ideas, please any feedback and/or
>>> > suggestions would be greatly appreciated.
>>> 
>>> I tried to follow your code and AFAICS, here is what happens: you call
>>> DOMImplementationRegistry::getDOMImplementation() which returns some
>>> Xerces-provided instance of DOMImplementation. Then you cast it (with
>>> a C-style cast) to your custom_dom_implementation_impl type, even though
>>> it's not. Then you call createLSParser(), which (probably) ends up
>>> calling Xerces' original implementation and you get Xerces' original
>>> DOMLSParserImpl. Or you call createCustomLSParser(), which is wrong,
>>> but by the looks of it, it should return you an instance of your
>>> custom_dom_LS_parser_impl (because it's not a virtual function and
>>> you don't reference any data member).
>>> 
>>> Why don't you get rid of all this DOMImplementation stuff and create
>>> an instance of your custom_dom_LS_parser_impl directly:
>>> 
>>> xml::dom::auto_ptr<custom_dom_LS_parser_impl> parser(
>>>   new (manager) custom_dom_LS_parser_impl(0, manager, gramPool));
>> 
>>> On Wed, Jun 8, 2022 at 10:51 AM Boris Kolpackov <boris at codesynthesis.com> wrote:
>>> Carlos Wong <carloswong54 at gmail.com> writes:
>>> 
>>> > But I can only either make the embedded binary representation work or my
>>> > customer error handler. I have run out of ideas, please any feedback and/or
>>> > suggestions would be greatly appreciated.
>>> 
>>> I tried to follow your code and AFAICS, here is what happens: you call
>>> DOMImplementationRegistry::getDOMImplementation() which returns some
>>> Xerces-provided instance of DOMImplementation. Then you cast it (with
>>> a C-style cast) to your custom_dom_implementation_impl type, even though
>>> it's not. Then you call createLSParser(), which (probably) ends up
>>> calling Xerces' original implementation and you get Xerces' original
>>> DOMLSParserImpl. Or you call createCustomLSParser(), which is wrong,
>>> but by the looks of it, it should return you an instance of your
>>> custom_dom_LS_parser_impl (because it's not a virtual function and
>>> you don't reference any data member).
>>> 
>>> Why don't you get rid of all this DOMImplementation stuff and create
>>> an instance of your custom_dom_LS_parser_impl directly:
>>> 
>>> xml::dom::auto_ptr<custom_dom_LS_parser_impl> parser(
>>>   new (manager) custom_dom_LS_parser_impl(0, manager, gramPool));


More information about the xsd-users mailing list