[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