Pau,

When you are using the InputSoure, you have to set the SystemId on the inputSource which will be used hen resolving relative URI's. Since you are using a relative schemaLocation, hotelres.xsd. If you do not set the systemId, xerces will use the java workdir to resolve locations. I guess that in your working example, the xsd was in the same place as the xml instance.

Hope this helps,
Dick Deneer
Op 22-feb-2007, om 10:55 heeft pau carre het volgende geschreven:

Hi, I am developing a WebServices server and I want to use Xerces to
validate XML instances that clients send me with SOAP messages.

First, I tried a simple example to validate an XML instance contained
in a file and then validate it with an XSD Schema (i.e. using URIs),
and It worked perfectly.
Code:
parser.setFeature("http://xml.org/sax/features/validation";, true);
parser.setFeature("http://apache.org/xml/features/validation/ schema", true); parser.setFeature( "http://apache.org/xml/features/validation/ schema-full-checking",true); parser.setProperty( "http://apache.org/xml/properties/schema/ external-schemaLocation", SchemaURI); parser.setFeature("http://apache.org/xml/features/nonvalidating/ load-external-dtd",true);
Validator handler = new Validator();
parser.setErrorHandler(handler);
parser.parse(XMLDocumentUri);

The problem is that then I tried to validate an string containing an
XML document, which is the method I want to use, Xerces throws this
SAXParseException: cvc-elt.1: Cannot find the declaration of element
'tns:contract'.
Code:
// the same configuration stuff above written changing the parse call for:
parser.parse(new InputSource(new StringReader(StringXmlDocument)));

Then I tried to write an empty XML file with the StringXmlDocument
content and validate it with its URI, and it worked!

But, so as not to have problems with deployment I would like to parse
directly the string XML instance...

I have used unsuccessfully two different versions of Xerces: 2.6.2 and 2.9.0

The String XML declaration looks like:
String StringXmlDocument =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
          "<tns:contract currency=\"\" id=\"\" messageVersion=\"1.0\"
providerID=\"\" title=\"\" xmlns:tns=\"http://globalip:8080/hotelres\";
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\";
xsi:schemaLocation=\"http://globalip:8080/hotelres hotelres.xsd \">\n"
          + "<tns:hotel id=\"\" name=\"\"/>\n"
          + "<tns:roomtypes>\n"
            + "<tns:roomtype code=\"\" maxpaxes=\"0\"
minChildren=\"0\" minadults=\"0\" minpaxes=\"0\"/>\n"
          + "</tns:roomtypes>\n"
          + "<tns:paxtypes>\n"
                        ....
                        


The XML instance used is the same as the string one.

The XML Schema (XSD file) looks like:
<schema xmlns="http://www.w3.org/2001/XMLSchema";
        targetNamespace="http://globalip:8080/hotelres";
        xmlns:tns="http://globalip:8080/hotelres";
        elementFormDefault="qualified">
        <element name="contract">
                <complexType>
                        <sequence>
                                <element name="hotel" type="tns:hotelType">
                                        <annotation>
                                                <documentation>
                                                        Definición del hotel 
para el cual es el
                                                        contrato.
                                                </documentation>
                                        </annotation>
                                </element>
                                
                                                ....


                        
Any idea?
Thanks in advance,
Pau

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to