We help IT Professionals succeed at work.

Once again : schema validation with java

jguy
jguy asked
on
Hi,

I tried several methods to validate xml file using schema. None of those methods give me satisfaction.

First one :

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(getHandler());

builder.parse(file);

Seconde one :
javax.xml.parsers.SAXParserFactory factory =
javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(false);
javax.xml.parsers.SAXParser parser = factory.newSAXParser();

parser.parse(file,getHandler());

Third one :
com.ibm.xml.parsers.RevalidatingDOMParser parser = new com.ibm.xml.parsers.RevalidatingDOMParser();
parser.setErrorHandler(getHandler());
parser.setCheckNamespace(false);

parser.parse(file);


XML file is the following:
<?xml version="1.0" encoding="UTF-8"?>
<SMArt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="I:/schema-dico/capteurs/Capteurs.xsd">
      <Capteurs>
            <Capteur id="CDR_REA" type="chaines"/>
            <Capteur id="CLASSE_ASPFACEG" type="chaines"/>
            <Capteur id="CLASSE_ASPFACENG" type="chaines"/>
            <Capteur id="COD_GRPFAMQTVIS" type="chaines"/>
            <Capteur id="COD_QTVIS" type="chaines"/>
            <Capteur id="EP_TOTSORTIEGAL" min="400" max="2100"/>
            <Capteur id="EPAISSEUR_BOB" min="0.4" max="2.1"/>
            <Capteur id="EPREV_AR"/>
            <Capteur id="EPREV_AV"/>
            <Capteur id="FINI_REA" type="chaines"/>
            <Capteur id="LARG_COIL_SORUAC"/>
            <Capteur id="LARG_SORTIECDR" min="700" max="1900"/>
            <Capteur id="LARG_SORTIESKIN" min="700" max="1900"/>
            <Capteur id="LARGEUR_BOB" min="700" max="1900"/>
            <Capteur id="LONG_BOBFILLE"/>
            <Capteur id="LONG_COIL_SORUAC"/>
            <Capteur id="LONGUEUR_BOB"/>
            <Capteur id="MODE_RECUIT" type="chaines"/>
            <Capteur id="NATREV_FACE_G" type="chaines"/>
            <Capteur id="NATREV_FACE_NG" type="chaines"/>
            <Capteur id="NB_PIC"/>
            <Capteur id="NUM_SOUSRM" type="chaines"/>
            <Capteur id="NUM_VERSION_QT" type="chaines"/>
            <Capteur id="RUGOSITE"/>
            <Capteur id="TENEUR_ALMETAL"/>
            <Capteur id="TENEUR_AS"/>
            <Capteur id="TENEUR_B"/>
            <Capteur id="TENEUR_C"/>
            <Capteur id="TENEUR_CA"/>
            <Capteur id="TENEUR_CR"/>
            <Capteur id="TENEUR_CU"/>
            <Capteur id="TENEUR_H"/>
            <Capteur id="TENEUR_MN"/>
            <Capteur id="TENEUR_MO"/>
            <Capteur id="TENEUR_N"/>
            <Capteur id="TENEUR_NB"/>
            <Capteur id="TENEUR_NI"/>
            <Capteur id="TENEUR_O"/>
            <Capteur id="TENEUR_P"/>
            <Capteur id="TENEUR_S"/>
            <Capteur id="TENEUR_SB"/>
            <Capteur id="TENEUR_SI"/>
            <Capteur id="TENEUR_SN"/>
            <Capteur id="TENEUR_TI"/>
            <Capteur id="TENEUR_V"/>
            <Capteur id="TENEUR_ZR"/>
            <Capteur id="ASP_BRAME_INF" type="chaines"/>
            <Capteur id="ASP_BRAME_SUP" type="chaines"/>
            <Capteur id="CODE_ACIER_REAL" type="chaines"/>
            <Capteur id="CODE_INCIDENT1" type="chaines"/>
            <Capteur id="CODE_INCIDENT2" type="chaines"/>
            <Capteur id="CODE_INCIDENT3" type="chaines"/>
            <Capteur id="CODE_INCIDENT4" type="chaines"/>
            <Capteur id="CODE_INCIDENT5" type="chaines"/>
            <Capteur id="CODE_INCIDENT6" type="chaines"/>
            <Capteur id="CODE_INCIDENT7" type="chaines"/>
            <Capteur id="CODE_INCIDENT8" type="chaines"/>
            <Capteur id="DateAnalyse" type="chaines"/>
            <Capteur id="EPAISSEUR_BRAME"/>
            <Capteur id="GRAVITE" type="chaines"/>
            <Capteur id="IdAnalyse" type="chaines"/>
            <Capteur id="LARGEUR_BRAME"/>
            <Capteur id="LONGUEUR_BRAME"/>
            <Capteur id="NIV_BOURS_INF" type="chaines"/>
            <Capteur id="NIV_BOURS_SUP" type="chaines"/>
            <Capteur id="PRECAUTION" type="chaines"/>
            <Capteur id="TOP_BRAM_MELANGE"/>
            <Capteur id="BOB_SELECTIF" type="chaines"/>
            <Capteur id="EPAI_COIL_SORUAC"/>
            <Capteur id="NUM_BOBINEUSE" type="chaines"/>
            <Capteur id="NUM_FOUR_BRA" type="chaines"/>
            <Capteur id="TEMP_BOBINAGE"/>
            <Capteur id="TEMP_DEFOUR_BRA"/>
            <Capteur id="TEMP_ENFOUR_BRA"/>
            <Capteur id="TEMP_ENT_REV"/>
            <Capteur id="TEMP_FIN_LAM"/>
            <Capteur id="TEMP_SOR_REV"/>
            <Capteur id="TEMPS_SEJOUR_FOU"/>
            <Capteur id="ARROSAGE_ENT_DKP" type="chaines"/>
            <Capteur id="T_CHAUFFE" min="550" max="1000"/>
            <Capteur id="T_MAINTIEN" min="550" max="1000"/>
            <Capteur id="T_REFLENT" min="550" max="1000"/>
            <Capteur id="T_REFLENT_BIS" min="550" max="1000"/>
            <Capteur id="T_REFRAP" min="350" max="700"/>
            <Capteur id="T_REFRAP_BIS" min="350" max="700"/>
            <Capteur id="THNXV1ENT"/>
            <Capteur id="THNXV1SOR"/>
            <Capteur id="THNXV2ENT"/>
            <Capteur id="THNXV2SOR"/>
            <Capteur id="TRAC_RECUIT" min="200" max="1600"/>
            <Capteur id="TRAC_REFR" min="800" max="2000"/>
            <Capteur id="TZONE_CH1"/>
            <Capteur id="TZONE_CH2"/>
            <Capteur id="TZONE_CH3"/>
            <Capteur id="TZONE_CH4"/>
            <Capteur id="TZONE_CH5"/>
            <Capteur id="TZONE_CH5A"/>
            <Capteur id="TZONE_CH6"/>
            <Capteur id="TZONE_CH6A"/>
            <Capteur id="TZONE_MA1"/>
            <Capteur id="TZONE_MA2"/>
            <Capteur id="V_CENTRE" min="0" max="200"/>
            <Capteur id="V_OPTIMA"/>
            <Capteur id="O2_TR"/>
            <Capteur id="T_TROMPE" min="350" max="700"/>
            <Capteur id="AL_BAIN" min="50" max="400"/>
            <Capteur id="CREUSET" type="chaines"/>
            <Capteur id="DATE_PRE_BAIN" type="chaines"/>
            <Capteur id="DISTANCE_DB"/>
            <Capteur id="FE_BAIN" min="1" max="50"/>
            <Capteur id="NIV_BAIN" min="-10" max="100"/>
            <Capteur id="NIV_SURVERSE" min="-349" max="100"/>
            <Capteur id="PPOMP_MOY"/>
            <Capteur id="PUIS_CREUS"/>
            <Capteur id="TBAIN_MOY" min="450" max="480"/>
            <Capteur id="UNITE_ZN" type="chaines"/>
            <Capteur id="TRAC_GALVA" min="1000" max="5000"/>
            <Capteur id="ALLONG_SKIN" min="0" max="2.5"/>
            <Capteur id="CAMBRAGE" min="-80" max="150"/>
            <Capteur id="CODCYL_INF" type="chaines"/>
            <Capteur id="CODCYL_SUP" type="chaines"/>
            <Capteur id="DIA_INF"/>
            <Capteur id="DIA_SUP"/>
            <Capteur id="EFFLAM_SKIN" min="0" max="1000"/>
            <Capteur id="FINICYL" type="chaines"/>
            <Capteur id="HUILINF" min="5" max="50"/>
            <Capteur id="HUILSUP" min="5" max="50"/>
            <Capteur id="LONG_RECTIF"/>
            <Capteur id="RUGOCYL_INF"/>
            <Capteur id="RUGOCYL_SUP"/>
            <Capteur id="TRAC_ENSKP" min="1000" max="9000"/>
            <Capteur id="TRAC_SOSKP" min="1000" max="9000"/>
            <Capteur id="TRV_INF" type="chaines"/>
            <Capteur id="TRV_SUP" type="chaines"/>
            <Capteur id="UTIL_SKIN"/>
      </Capteurs>
</SMArt>

Schema is the following :
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      <xsd:element name="Capteur">
            <xsd:complexType>
                  <xsd:attribute name="id" type="xsd:ID" use="required"/>
                  <xsd:attribute name="type" type="xsd:CDATA" use="optional"/>
                  <xsd:attribute name="min" type="xsd:CDATA" use="optional"/>
                  <xsd:attribute name="max" type="xsd:CDATA" use="optional"/>
                  <xsd:attribute name="zone" type="xsd:CDATA" use="optional"/>
                  <xsd:attribute name="autoriseZero" type="xsd:string" use="optional"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="SMArt">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="Capteurs"/>
                  </xsd:sequence>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Capteurs">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="Capteur" minOccurs="0" maxOccurs="unbounded"/>
                  </xsd:sequence>
            </xsd:complexType>
      </xsd:element>
</xsd:schema>


I tried changing the namespace (2000/10 instead of 2001).

When i use ibm parser, error message indicates that xmlns:xsi is not declared as attribut of element SMArt.

Each time, error message indicates that elements SMArt, Capteurs and Capteur are not declared.

Using XMLSpy, the validation is OK.

Please, can somebody elucidate this mysterious effect ?




 
Comment
Watch Question

Wayne BradneyIndependent Consultant

Commented:
jguy,

I don't think there's a type CDATA in XML Schema. Xerces 1.4.3 says:

org.xml.sax.SAXParseException: Schema error: attribute type has a type (xsd:CDATA) which is not recognized as one of the predefined schema datatypes.

I think CDATA was changed to normalizedString before the final release of the SPEC. When I changed your schema types to normalizedString instead of CDATA, Xerces validated the document without a problem. I don't know why XMLSpy would allow this, maybe it only supports a pre-recommendation version of the XML Schema spec. I don't know why the IBM parser isn't giving you the right error message, maybe it's an old version (IBM's parser is based on Xerces).

You may have other problems due to the fact that noNamespaceSchemaLocation has to be a URI, and "I:/schema-dico/capteurs/Capteurs.xsd" isn't a URI. Try file://... or http://... if your schema is accessible via the web.

Regards,
WMB

Author

Commented:
Hi WMB,

I changed the URI location and the CDATA to normalizedString.

And used the following java code :

org.apache.xerces.parsers.SAXParser parser = new org.apache.xerces.parsers.SAXParser();
parser.setFeature("http://apache.org/xml/features/validation/schema", true);
parser.setFeature("http://xml.org/sax/features/validation", true);
        parser.setErrorHandler(getHandler());

parser.parse(file);

The result was OK. I had want i expected to.
Now i'de like do the same with builder.

Have you got a solution ?

Regards
Wayne BradneyIndependent Consultant

Commented:
jguy,

How about:

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  dbf.setValidating(true);
  dbf.setNamespaceAware(false);
  DocumentBuilder db = dbf.newDocumentBuilder();
  db.setErrorHadnler(getHandler());
  Document doc = db.parse(file);

Regards,
WMB
Wayne BradneyIndependent Consultant

Commented:
[except for the typo!] setErrorHandler()

Author

Commented:
Hi WMB,

I had already tried the code you gave me. But it does not work. The validation is ok with SAXParser but not with the DocumentBuilder. Perhaps, the is an the same same that setFeature for the buider to turn on the schema validation. I think the builder try to validate the document in front of a DTD and not a schema. What do you think about that ?

Regards,
Jerome
Independent Consultant
Commented:
jguy,

That's right. DTDs can contain no concept of namespaces, but in order to validate against XML Schema your parser must be namespace aware, otherwise the parser won't even be able to resolve the Schema namespace (xsi:).

So setNamespaceAware(true) when you want to validate against XML Schema.

Regards,
WMB

Author

Commented:
Ok

Now all is good. I effectively tried with
setNamespaceAware(true) and i had the result i expected too.

Thanks a lot

Explore More ContentExplore courses, solutions, and other research materials related to this topic.