[Interest] QXmlSchemaValidator with local schema files
Roger Leigh
rleigh at codelibre.net
Sat Feb 16 13:28:47 CET 2019
Hi folks,
I'm wanting to validate some XML with QXmlSchemaValidator, but I want it
to use local copies of the schema files. I'm doing this:
std::string xml = read_file();
CustomResolver r;
QXmlSchemaValidator v;
v.setUriResolver(&r);
QByteArray raw_data(s.c_str(), s.size());
bool valid = v.validate(raw_data);
This is working. It's validating against the schema file(s) in the
input document and returning true or false currectly on success or
error. However... it's not calling the resolve() function in the URI
resolver, so I can't map these schema URIs to local files. So every
invocation requires network activity and is quite slow.
Is this the intended purpose of setUriResolver()? Should this be
expected to work?
I also tried "v.schema().setUriResolver(&r);" since I saw this also had
an option for setting a URI resolver, but this has no effect.
Is there a way of achieving this? With Xerces-C++, I was using a custom
EntityResolver for this purpose, which worked perfectly to search a
local tree of XML catalogue files. I want to achieve the equivalent
behaviour with QtXmlPatterns/QtXml.
My resolve() function is currently a no-op:
QUrl
CustomResolver::resolve(const QUrl &relative,
const QUrl &baseURI) const
{
std::cerr << "QT resolve URI: rel="
<< relative.toString().toStdString() << " base="
<< baseURI.toString().toStdString() << std::endl;
return baseURI.resolved(relative);
}
I never see any output, so I'm fairly confident it's not being called.
Thanks,
Roger
More information about the Interest
mailing list