You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by "Yasir Bajwa (Jira)" <xe...@xml.apache.org> on 2022/02/12 00:23:00 UTC

[jira] [Updated] (XERCESJ-1739) EntityResolver is not invoked for xsi:schemaLocation attribute

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

Yasir Bajwa updated XERCESJ-1739:
---------------------------------
    Description: 
setEntityResolver on SAXParser is not being called to resolve xsi:schemaLocation.

Example:

        class DummyResolver implements EntityResolver {

            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException

{                 throw new SAXException("Access denied.");             }

        }    

        // main()

        // Path schemaPath ...
        // Path dataPath ...

        SchemaFactory schemaFactory = SchemaFactory.newInstance(
                "http://www.w3.org/XML/XMLSchema/v1.1");

        StreamSource schemaSource = new StreamSource(schemaPath.toFile());
        Schema schema = schemaFactory.newSchema(schemaSource);

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setSchema(schema);
        spf.setNamespaceAware(true);
        SAXParser sp = spf.newSAXParser();
    
        XMLReader parser = sp.getXMLReader();
        //parser.setErrorHandler(new SAXErrorHandler());
        //parser.setContentHandler(new TestHandler());
        parser.setEntityResolver( new DummyResolver());
        InputSource is = new InputSource(new FileInputStream(dataPath.toFile()));
        parser.parse(is);

 

Schema (i.e. the file 'schemaPath' variable references in the code above)

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

    <!-- ROOT ELEMENT -->
    <xs:element name="SiebelMessage">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CaseNum" maxOccurs="7" type="xs:string" />
                <xs:any minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

 

fod.xsd:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://intra.tpon.gov.on.ca/fod"
    targetNamespace="http://intra.tpon.gov.on.ca/fod"
>
    <xs:element name="testElement" type="xs:integer" />

</xs:schema>

 

Instance:

<?xml version="1.0" encoding="UTF-8" ?>

<SiebelMessage 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:fod="http://intra.fod.gov.on.ca"
    xsi:schemaLocation="http://intra.fod.gov.on.ca fod.xsd"
>

    <CaseNum>1234</CaseNum>
    <CaseNum>1234</CaseNum>
    <CaseNum>1234</CaseNum>
    <fod:testElement>123</fod:testElement>
</SiebelMessage>

 

Result:

Exception in thread "main" org.xml.sax.SAXException: Error: URI=[file:///C:/tpon/fod/schema/xerces_tests/test1/input.xml] Line=12: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'fod:testElement'.

 

Expected result was for xsi:schemaLocation to try resolve the fod namespace and call entity resolver to get the fod.xsd schema docment.

  was:
setEntityResolver on SAXParser is not being called to resolve xsi:schemaLocation.

 

Example:

 

        class DummyResolver implements EntityResolver {

            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
                throw new SAXException("Access denied.");
            }
        }    

        // main()

        // Path schemaPath ...
        // Path dataPath ...

        SchemaFactory schemaFactory = SchemaFactory.newInstance(
                "http://www.w3.org/XML/XMLSchema/v1.1");

        StreamSource schemaSource = new StreamSource(schemaPath.toFile());
        Schema schema = schemaFactory.newSchema(schemaSource);

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setSchema(schema);
        spf.setNamespaceAware(true);
        SAXParser sp = spf.newSAXParser();
    
        XMLReader parser = sp.getXMLReader();
        //parser.setErrorHandler(new SAXErrorHandler());
        //parser.setContentHandler(new TestHandler());
        parser.setEntityResolver( new DummyResolver());
        InputSource is = new InputSource(new FileInputStream(dataPath.toFile()));
        parser.parse(is);

 

Schema (i.e. the file 'schemaPath' variable references in the code above)

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

    <!-- ROOT ELEMENT -->
    <xs:element name="SiebelMessage">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CaseNum" maxOccurs="7" type="xs:string" />
                <xs:any minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

 

fod.xsd:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://intra.tpon.gov.on.ca/fod"
    targetNamespace="http://intra.tpon.gov.on.ca/fod"
>
    <xs:element name="testElement" type="xs:integer" />

</xs:schema>

 

Instance:

<?xml version="1.0" encoding="UTF-8" ?>

<SiebelMessage 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:fod="http://intra.fod.gov.on.ca"
    xsi:schemaLocation="http://intra.fod.gov.on.ca fod.xsd"
>

    <CaseNum>1234</CaseNum>
    <CaseNum>1234</CaseNum>
    <CaseNum>1234</CaseNum>
    <fod:testElement>123</fod:testElement>
</SiebelMessage>

 

Result:

Exception in thread "main" org.xml.sax.SAXException: Error: URI=file:///C:/tpon/fod/schema/xerces_tests/test1/input.xml Line=12: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'fod:testElement'.

 

Expected result was for xsi:schemaLocation to try resolve the fod namespace and call entity resolver to get the fod.xsd schema docment.


> EntityResolver is not invoked for xsi:schemaLocation attribute
> --------------------------------------------------------------
>
>                 Key: XERCESJ-1739
>                 URL: https://issues.apache.org/jira/browse/XERCESJ-1739
>             Project: Xerces2-J
>          Issue Type: Bug
>          Components: JAXP (javax.xml.validation)
>    Affects Versions: 2.12.1
>            Reporter: Yasir Bajwa
>            Priority: Minor
>
> setEntityResolver on SAXParser is not being called to resolve xsi:schemaLocation.
> Example:
>         class DummyResolver implements EntityResolver {
>             @Override
>             public InputSource resolveEntity(String publicId, String systemId) throws SAXException
> {                 throw new SAXException("Access denied.");             }
>         }    
>         // main()
>         // Path schemaPath ...
>         // Path dataPath ...
>         SchemaFactory schemaFactory = SchemaFactory.newInstance(
>                 "http://www.w3.org/XML/XMLSchema/v1.1");
>         StreamSource schemaSource = new StreamSource(schemaPath.toFile());
>         Schema schema = schemaFactory.newSchema(schemaSource);
>         SAXParserFactory spf = SAXParserFactory.newInstance();
>         spf.setSchema(schema);
>         spf.setNamespaceAware(true);
>         SAXParser sp = spf.newSAXParser();
>     
>         XMLReader parser = sp.getXMLReader();
>         //parser.setErrorHandler(new SAXErrorHandler());
>         //parser.setContentHandler(new TestHandler());
>         parser.setEntityResolver( new DummyResolver());
>         InputSource is = new InputSource(new FileInputStream(dataPath.toFile()));
>         parser.parse(is);
>  
> Schema (i.e. the file 'schemaPath' variable references in the code above)
> <?xml version="1.0" encoding="UTF-8" ?>
> <xs:schema 
>     xmlns:xs="http://www.w3.org/2001/XMLSchema"
> >
>     <!-- ROOT ELEMENT -->
>     <xs:element name="SiebelMessage">
>         <xs:complexType>
>             <xs:sequence>
>                 <xs:element name="CaseNum" maxOccurs="7" type="xs:string" />
>                 <xs:any minOccurs="0" />
>             </xs:sequence>
>         </xs:complexType>
>     </xs:element>
> </xs:schema>
>  
> fod.xsd:
> <?xml version="1.0" encoding="UTF-8" ?>
> <xs:schema 
>     xmlns:xs="http://www.w3.org/2001/XMLSchema"
>     xmlns="http://intra.tpon.gov.on.ca/fod"
>     targetNamespace="http://intra.tpon.gov.on.ca/fod"
> >
>     <xs:element name="testElement" type="xs:integer" />
> </xs:schema>
>  
> Instance:
> <?xml version="1.0" encoding="UTF-8" ?>
> <SiebelMessage 
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>     xmlns:fod="http://intra.fod.gov.on.ca"
>     xsi:schemaLocation="http://intra.fod.gov.on.ca fod.xsd"
> >
>     <CaseNum>1234</CaseNum>
>     <CaseNum>1234</CaseNum>
>     <CaseNum>1234</CaseNum>
>     <fod:testElement>123</fod:testElement>
> </SiebelMessage>
>  
> Result:
> Exception in thread "main" org.xml.sax.SAXException: Error: URI=[file:///C:/tpon/fod/schema/xerces_tests/test1/input.xml] Line=12: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'fod:testElement'.
>  
> Expected result was for xsi:schemaLocation to try resolve the fod namespace and call entity resolver to get the fod.xsd schema docment.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: j-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org