[ 
https://issues.apache.org/jira/browse/XERCESC-2232?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alan Howells updated XERCESC-2232:
----------------------------------
    Description: 
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.

  was:
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.

 


> 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
>            Priority: Major
>              Labels: regression
>         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

Reply via email to