[Java] XML valideren op XML-schema met SAX

Pagina: 1
Acties:

  • mcB
  • Registratie: Mei 2002
  • Laatst online: 08-05 22:11
Ik ben nu al een tijdje aan het proberen om een stukje XML te valideren in Java met behulp van een Xerces SAX parser. Overal op internet kwam ik voorbeelden tegen die allemaal neerkwamen op de java code zoals hieronder.

Om te testen heb ik een klein XML bericht met een simpel xml-schema gebruikt.
In de java code ga ik er vanuit dat wanneer er geen exceptions optreden de xml gevalideerd is. Alle fouten zouden namelijk aan de errorHandler gegeven moeten worden en deze gooit bij mij de exception gewoon door.

In de huidige situatie wordt de xml gevalideerd, ongeacht het datatype van de velden to,from,heading en body (dat String zou moeten zijn). Het is zelfs erger, er wordt niet eens gekeken naar die elementen. Het maakt nu namelijk niet uit hoe de elementen in de XML heten. Die 4 elementen to,from,heading en body mogen zelfs helemaal weg gelaten worden en nog krijg ik geen foutmelding.

Ik zou dus zeggen dat de de XML helemaal niet tegen het goede schema gevalideerd wordt. Echter, wanneer ik de naam van het rootelement('note') in de xml aanpas dan krijg ik wel een foutmelding.

De verwachting is dus dat of de xml-schema niet strict genoeg is, of er mist nog iets essentieels in de java code. Wie helpt mij op weg?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.apache.xerces.parsers.SAXParser;
 
public class SchemaTest {

  public static void main (String args[]) {
    try {  
    SAXParser parser = new SAXParser();
        parser.setFeature("http://apache.org/xml/features/validation/schema", true); 
        parser.setErrorHandler(new ErrorChecker());
        parser.parse("note.xml");
                        
        System.out.println("Valid");
    } catch (Exception e) { 
      System.out.print("\nProblem parsing the file. \n");
      System.err.print(e);
    }
  }
}


code:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">
<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

Strix (Skullflame)


  • tjerkw
  • Registratie: September 2004
  • Laatst online: 04-04-2024
mcB schreef op vrijdag 25 februari 2005 @ 14:43:
Ik ben nu al een tijdje aan het proberen om een stukje XML te valideren in Java met behulp van een Xerces SAX parser. Overal op internet kwam ik voorbeelden tegen die allemaal neerkwamen op de java code zoals hieronder.

Om te testen heb ik een klein XML bericht met een simpel xml-schema gebruikt.
In de java code ga ik er vanuit dat wanneer er geen exceptions optreden de xml gevalideerd is. Alle fouten zouden namelijk aan de errorHandler gegeven moeten worden en deze gooit bij mij de exception gewoon door.
Dit is geen goede manier van foutafhandeling. Je vangt nu gewoon ALLE excepties, ook een ClassNotFoundException of wat dan ook. Vang dus een exceptie die dichter bij de fouten liggen die je wilt afhandelen. Nu wil je vooral parser fouten afhandelen. Waarschijnlijk is er vast wel een XMLPasreException of iets dergeleks in Xerces.. kijk even in de api.
In de huidige situatie wordt de xml gevalideerd, ongeacht het datatype van de velden to,from,heading en body (dat String zou moeten zijn). Het is zelfs erger, er wordt niet eens gekeken naar die elementen. Het maakt nu namelijk niet uit hoe de elementen in de XML heten. Die 4 elementen to,from,heading en body mogen zelfs helemaal weg gelaten worden en nog krijg ik geen foutmelding.
Hmm dat is raar.. Ik weet zelf niet veel van de Xerces XML lib maar denk dat je daar naar een oplossing moet zoeken.
Ik zou dus zeggen dat de de XML helemaal niet tegen het goede schema gevalideerd wordt. Echter, wanneer ik de naam van het rootelement('note') in de xml aanpas dan krijg ik wel een foutmelding.
mag ik vragen wat van foutmelding je krijgt??
De verwachting is dus dat of de xml-schema niet strict genoeg is, of er mist nog iets essentieels in de java code. Wie helpt mij op weg?
Je zou de attribuut minOccurs nog kunnen opnemen in je xsd, zodat elke element minstens 1 keer moet voorkomen. Ik weet niet precies wat het gedrag van <xsd:sequence is..

Tjerk W


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 08-05 22:11
1) Het afvangen van alle exceptions is even voor het gemak gedaan. Het zou eigenlijk alleen voor 'SAXException' moeten, want dat is de exception die gethrowd kan worden door de parse-methode.

2) Ik heb al heel veel gezocht, maar ik kon er niets vinden, dus vandaar de vraag hier op GoT

3) Ik heb de applicatie niet bij de hand, dus ik kan je niet exact vertellen wat de melding is, maar de strekking is; SAXException: kan geen root element met de naam 'blaat' vinden.

4) De xml en bijbehorende xml-schema zijn gemaakt in XML-spy. Volgens XML-spy hebben alle elementen in het schema een minOccurs 1 en ook een maxOccurs 1
Ze zijn dus verplicht.

Strix (Skullflame)


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 08-05 22:11
tjerkw schreef op vrijdag 25 februari 2005 @ 17:28:
...
mag ik vragen wat van foutmelding je krijgt??
...
In de XML heb ik het root element nu dus 'vote' genoemd. De exception die ik hierdoor krijg;

Java:
1
2
3
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'vote'.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        ...

Strix (Skullflame)


  • mcB
  • Registratie: Mei 2002
  • Laatst online: 08-05 22:11
Het probleem is inmiddels opgelost.
er miste nog een feature;
Java:
1
parser.setFeature("http://xml.org/sax/features/validation", true);


Je zou toch zeggen dat wanneer de feature 'valideer op basis van xml-schema' anstaat, dat dan niet meer expliciet opgegeven hoeft te worden dat er gevalideerd moet worden. 8)7

Strix (Skullflame)