[xsd-users] File Closing

Boris Kolpackov boris at codesynthesis.com
Mon Jul 16 12:10:15 EDT 2007


Hi Ryan,

Prather, Ryan C SSgt DMSG/WMTS <Ryan.Prather at afspc.af.mil> writes:

> Is xsd/xerces thread-safe?

Yes but you need to make sure the Xerces-C++ runtime if initialized
and terminated only once. The easies way to do this is to
initialize/terminate Xerces-C++ from main() when there aren't any
threads yet/anymore:

#include <xercesc/util/PlatformUtils.hpp>

int
main ()
{
  xercesc::XMLPlatformUtils::Initialize ();

  {
    // Start threads and parse here.
  }

  xercesc::XMLPlatformUtils::Terminate ();
}

Because you initialize the runtime yourself you should also
pass the xml_schema::flags::dont_initialize flag to the parse()
function:

xml_schema::document doc_p (...);

doc_p.parse ("test.xml", xml_schema::flags::dont_initialize);


> 2. We are getting an error "Type XMLPlatformException, message: Could
> not close the file", does xsd use a static or dynamic file handle to
> reading the files? When and where is the file closed?

In this case the file opening and closing is performed by Xerces-C++
and there appears to be a bug that is fixed for the next version of
Xerces-C++:

https://issues.apache.org/jira/browse/XERCESC-1658

This problem only occurs on Solaris, right?


> Would there be a way that I can call the file closer to close the
> file within say the post of the root tag?

If you don't use XML Schema validation in Xerces-C++ then you can
handle file opening/closing yourself and pass an std::istream to
the parse() function instead of a file name:

#include <fstream>

std::ifstream ifs ("test.xml");

if (!ifs.open ())
{
  // could not open
}

...

doc_p.parse (ifs, "test.xml", xml_schema::flags::dont_initialize);

...

ifs.close ();

If you do use XML Schema validation, then this method may not work
because Xerces-C++ will still be opening the schema files. For this
situation I can extract the fix from Xerces-C++ SVN and send it to
you.


hth,
-boris




More information about the xsd-users mailing list