Alan Howells created XERCESC-2232: ------------------------------------- Summary: xsi:nil="false" fails validation for child elements Key: XERCESC-2232 URL: https://issues.apache.org/jira/browse/XERCESC-2232 Project: Xerces-C++ Issue Type: Bug Components: Validating Parser (XML Schema) Affects Versions: 3.2.3 Reporter: Alan Howells Attachments: main.cxx
We recently upgraded to 3.2.3 and found an issue with xsi:nil="false" Running the following code (also attached): {code:java} #include <iostream> #include <string> #include <xercesc/dom/DOMException.hpp> #include <xercesc/framework/MemBufInputSource.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/sax/ErrorHandler.hpp> #include <xercesc/sax/SAXParseException.hpp> namespace { class XMLValidatorErrorHandler : public xercesc::ErrorHandler { public: void warning(const xercesc::SAXParseException &e) final { std::cerr << "Warning at file " << xercesc::XMLString::transcode(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << ". Message: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; } void error(const xercesc::SAXParseException &e) final { std::cerr << "Error at file " << xercesc::XMLString::transcode(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << ". Message: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; } void fatalError(const xercesc::SAXParseException &e) final { std::cerr << "Fatal Error at file " << xercesc::XMLString::transcode(e.getSystemId()) << ", line " << e.getLineNumber() << ", char " << e.getColumnNumber() << ". Message: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; } void resetErrors() final { } }; } // namespace int main(int argc, char **argv) { static_cast<void>(argc); static_cast<void>(argv); xercesc::XMLPlatformUtils::Initialize(); std::string inputXml( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<ns1:NillableElement" " xmlns:ns1=\"http://amat.com/apf/Nillable\"\n" " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" " xsi:schemaLocation=\"http://amat.com/apf/Nillable Nillable.xsd\"\n" " xsi:nil=\"false\">\n" " <ns1:Val1>v1</ns1:Val1>\n" "</ns1:NillableElement>\n"); std::string inputSchema( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<xs:schema" " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n" " xmlns:tns=\"http://amat.com/apf/Nillable\"\n" " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" " targetNamespace=\"http://amat.com/apf/Nillable\"\n" " elementFormDefault=\"qualified\">\n" " <xs:complexType name=\"TestType\">\n" " <xs:sequence>\n" " <xs:element name=\"Val1\" type=\"xs:string\"/>\n" " </xs:sequence>\n" " </xs:complexType>\n" " <xs:element name=\"NillableElement\" type=\"tns:TestType\" " "nillable=\"true\"/>\n" " <xs:element name=\"NonNillableElement\" type=\"tns:TestType\" " "nillable=\"false\"/>\n" "</xs:schema>\n"); xercesc::XercesDOMParser parser; parser.setValidationScheme(xercesc::XercesDOMParser::Val_Always); parser.setDoNamespaces(true); parser.setDoSchema(true); parser.setValidationSchemaFullChecking(true); parser.cacheGrammarFromParse(true); parser.useCachedGrammarInParse(true); XMLValidatorErrorHandler errorHandler; parser.setErrorHandler(&errorHandler); try { // Get Schema Input Source xercesc::MemBufInputSource schemaInputSource( reinterpret_cast<const XMLByte *>(inputSchema.c_str()), static_cast<XMLSize_t>(inputSchema.size()), "schema"); parser.loadGrammar( schemaInputSource, xercesc::Grammar::SchemaGrammarType, true); } catch (const xercesc::XMLException &e) { std::cerr << "Fatal Error during schema parsing: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; return EXIT_FAILURE; } catch (const xercesc::DOMException &e) { std::cerr << "Fatal Error during schema parsing: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; return EXIT_FAILURE; } // Validate the XML against the Schema. try { // Get XML Input Source xercesc::MemBufInputSource xmlInputSource( reinterpret_cast<const XMLByte *>(inputXml.c_str()), static_cast<XMLSize_t>(inputXml.size()), "xml"); parser.parse(xmlInputSource); } catch (const xercesc::XMLException &e) { std::cerr << "Fatal Error during xml parsing: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; return EXIT_FAILURE; } catch (const xercesc::DOMException &e) { std::cerr << "Fatal Error during xml parsing: " << xercesc::XMLString::transcode(e.getMessage()) << "\n"; return EXIT_FAILURE; } return EXIT_SUCCESS; } {code} returns the following validation error: {noformat} Error at file xml, line 6, char 13. Message: 'xsi:nil' specified for non-nillable element 'Val1' {noformat} But: * Only the NillableElement is marked as nillable in the schema, not Val1. * Only NillableElement element is marked as xsi:nil="false" in the xml, not Val1. * xsi:nil is not specified for Val1 This is a regression against 3.1.1 and older. -- This message was sent by Atlassian Jira (v8.20.1#820001) --------------------------------------------------------------------- To unsubscribe, e-mail: c-dev-unsubscr...@xerces.apache.org For additional commands, e-mail: c-dev-h...@xerces.apache.org