Hi Mathieu,
the proper way of handling this kind of configuration is by registering a resource resolver that, when asked for "schema2.xsd", returns the correct MemBufInputSource. Otherwise you could fix your code by parsing first the schema_2 and then the schema_1 buffer, so that schema_1 can find schema_2 already loaded in the grammar cache.

Alberto

On 11/18/2010 12:52 PM, Mathieu Champlon wrote:
Hello,

I have an XML file validated by xerces against a schema_1.xsd file which
xs:include's another schema_2.xsd file.
So far so good, by now I would like to move those files into memory.
I have been using a MemBufInputSource before for this, but there wasn't
any xs:include then.
Of course I cannot alter the schemas in any way. :)

Here is what I have been trying (xerces 3.x version) :

using namespace XERCES_CPP_NAMESPACE;

DOMLSParser&  parser = ...
parser.getDomConfig()->setParameter(
XMLUni::fgXercesUserAdoptsDOMDocument, true );
parser.getDomConfig()->setParameter( XMLUni::fgDOMNamespaces, true );
parser.getDomConfig()->setParameter( XMLUni::fgDOMDatatypeNormalization,
true );
parser.getDomConfig()->setParameter( XMLUni::fgXercesSchema, true );
parser.getDomConfig()->setParameter( XMLUni::fgDOMValidate, true );
parser.getDomConfig()->setParameter(
XMLUni::fgXercesUseCachedGrammarInParse, true  );
const std::string schema_1 = "<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'>"
                               "<xs:include schemaLocation='schema_2.xsd'/>"
                               "<xs:element name='element'>"
                               "<xs:complexType>"
                               "<xs:attribute name='attribute'
type='type'/>"
                               "</xs:complexType>"
                               "</xs:element>"
                               "</xs:schema>";
const std::string schema_2 = "<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'>"
                               "<xs:simpleType name='type'>"
                               "<xs:restriction base='xs:int'/>"
                               "</xs:simpleType>"
                               "</xs:schema>";
{
    MemBufInputSource source( reinterpret_cast<  const XMLByte*>(
schema_1.c_str() ), schema_1.size(), "schema_1.xsd" );
    Wrapper4InputSource input(&source, false );
    if( ! parser.loadGrammar(&input, Grammar::SchemaGrammarType, true ) )
      throw ...
}
{
    MemBufInputSource source( reinterpret_cast<  const XMLByte*>(
schema_2.c_str() ), schema_2.size(), "schema_2.xsd" );
    Wrapper4InputSource input(&source, false );
    if( ! parser.loadGrammar(&input, Grammar::SchemaGrammarType, true ) )
      throw ...
}

And then parsing the following XML document :<element attribute='42'/>
Yields the validation error : unable to find validator for simple type
of attribute 'attribute'

The validation succeeds however if the content of schema_2 is moved to a
schema_2.xsd file in the working directory.

Is what I am looking for theoretically possible ?
If yes I would really appreciate being pointed to the right direction. :)

Thanks a lot for any hint !

Regards,
MAT.

.


Reply via email to