Java XML validatie volgens XSD

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SMGGM
  • Registratie: Januari 2006
  • Laatst online: 11-09 17:29
Hallo

Ik ben bezig een Java programma te schrijven voor het maken van betalingsbestanden (XML) volgens internationale standaarden. Nu wilde ik in dit programma validatie inbouwen voor XML bestanden en deze controleren volgens het XSD schema gemaakt door -- hmmm -- die dat het betaalverkeer regelen :p

Op de site van Oracle heb ik gevonden dat Java deze validatie ingebouwd heeft in javax.xml.validation (http://java.sun.com/devel...cles/xml/validationxpath/). Ik heb dus een beetje copy/paste werk verricht om uiteindelijk een eenvoudige versie van de validator te bekomen om zo te testen of het degelijk werkt.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MyValidator {

    public static void main(String[] args) {
        try {
            // Parse an XML document into a DOM tree.
            DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document document = parser.parse(new File("D://Steven//Documenten//Java//Betalingen//simple.xml"));
            // Create a SchemaFactory capable of understanding WXS schemas.
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            // Load a WXS schema, represented by a Schema instance.
            Source schemaFile = new StreamSource(new File("D://Steven//Documenten//Java//Betalingen//simple.xsd"));
            Schema schema = factory.newSchema(schemaFile);
            // Create a Validator object, which can be used to validate
            // an instance document.
            Validator validator = schema.newValidator();
            // Validate the DOM tree.
            validator.validate(new DOMSource(document));
        } catch (ParserConfigurationException e) {
            System.out.println("Parser Config");
        } catch (SAXException e) {
            System.out.println(e.getMessage());
            System.out.println("SAX ex");
        } catch (IOException e) {
            System.out.println("IO ex");
        }
    }
}


Probleem is dat ik telkens bij het uitvoeren op eenzelfde fout terecht kom nl:
cvc-elt.1: Cannot find the declaration of element 'Document'.

Dit terwijl:
1. XMLSpy geen enkel probleem aangeeft met het bestand
2. Het XSD schema niet fout is (het bevat weldegelijk de declaratie van het element Document)
3. Wat ik tot nu gebruik zijn voorbeelden zijn van Febelfin - beheerder van betalingsverkeer in België - zelf (en die dus hopelijk wel weten hoe zo'n XML bestand eruit moet zien)

Ik heb verder nog een ander voorbeeld gebruikt (nl de het XML bestand en XSD schema op link: http://java.sun.com/devel...cles/xml/validationxpath/) om te zien of er iets niet klopt aan die validator en daar gaat alles perfect.
Ik sta dus nu voor een vreemde vraag: wie of wat is hier fout?

https://www.box.com/s/9a00e761b440946f92b4 (link naar het XSD schema)
https://www.box.com/s/a8e45eb88589a6c18b34 (link naar het te valideren XML document)

Ik hoop dat iemand mij wat verder kan helpen want ik zit muurvast. Ik kan geen wijzigingen doorvoeren aan het XSD schema en het XML bestand is correct (bevestigd door XMLSpy ahv het XSD schema en wordt zelf als voorbeeld aangereikt door Febelfin).
Enige verklaring is dat Java niet correct zijn werk doet :p

Alvast bedankt voor de input ;)

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 21:48
Java doet zijn werk wel correct...

Hint: kijk eens naar je eerste tag van de xml die je geupload hebt en vergelijk eens met de declaratie op wikipedia ;)

Ps: schema's en xml valideren kun je ook online testen: http://www.xmlvalidation.com/

[ Voor 5% gewijzigd door azerty op 03-05-2012 21:37 ]


Acties:
  • 0 Henk 'm!

  • PietPuk.nl
  • Registratie: November 2008
  • Laatst online: 13-01 14:12
Eerste tag in je document is fout.

Er staat:

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

moet zijn:

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

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
PietPuk.nl schreef op vrijdag 04 mei 2012 @ 10:59:
Eerste tag in je document is fout.

Er staat:

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

moet zijn:

<?xml version="1.0" encoding="UTF-8" ?>
[mierenneukmodus]
Dat is geen tag, maar de XML preamble.
[/mierenneukmodus]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 11-09 21:11
Je zou ook naar XMLBeans kunnen kijken. http://xmlbeans.apache.org/

Ben nu voor een soortgelijk project (ook pain) bezig met xmlbeans en dat werkt op zich wel makkelijk. Zou de tutorial eens doornemen als je tijd heb.

"Write code as if the next maintainer is a vicious psychopath who knows where you live."


Acties:
  • 0 Henk 'm!

  • SMGGM
  • Registratie: Januari 2006
  • Laatst online: 11-09 17:29
Bedankt voor de reacties, maar eigenlijk heb ik een foute copy paste gedaan. Die kwam van een PDF en daar zijn de vraagtekens uit verdwenen. Ik had het eigenlijk zelf getest met eigen bestanden maar uit privacy problemen kon ik die niet online gooien ;)
Het probleem ligt dus niet aan de vraagtekens die vergeten zijn.

Heb ondertussen het bestand bijgewerkt:
https://www.box.com/s/9a00e761b440946f92b4 (link naar het XSD schema)
https://www.box.com/s/a8e45eb88589a6c18b34 (link naar het te valideren XML document)

Nu ik ben verder gaan zoeken (omdat die validator die ik nu gebruik) echt wel traag is en op volgende gebotst:
http://www.herongyang.com...idator-Final-Version.html

Deze werkt stukken sneller en heeft geen problemen meer met mijn bestanden. Vreemd naar mijn mening gezien hij eigenlijk dezelfde API gebruikt.
Moet het blijkbaar wat nauwkeuriger gaan uitzoeken.

XMLBeans zal ik ook eens nakijken, maar moet tegen maandag een snelle validator hebben voor onze partners want nu zijn ze ons constant lastig aan het vallen voor stomme validatieproblemen.
Deze tijdelijk is alvast een begin en geeft al een goede indicatie.

Thanks alvast voor de input.
Moest iemand nog vinden wat nu het verschil is waarom die ene het wel doet en de andere niet, mag die dat altijd melden ;) Nu alleen geen tijd voor om zelf uit te zoeken.

Acties:
  • 0 Henk 'm!

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Je bent vergeten de DocumentBuilder namespace aware te maken. In de javadoc staat iig dat deze standaard niet namespace aware is. Als je dit doet werkt het prima met de voorbeeld files.

Java:
1
2
3
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder parser = dbf.newDocumentBuilder();


Verder sluit ik me aan bij Ozzie, een xml binding library kan wel handig zijn. Ik ken XMLBeans niet, maar je zou ook eens naar jaxb kunnen kijken, de sun/oracle implementatie zit standaard al in de jre. Hierbij zit ook een tool waarmee je met behulp van een schema pojo's kunt genereren. Het marschallen/unmarschallen (met validatie) tussen die pojo's en xml laat je dan aan jaxb over.

[ Voor 35% gewijzigd door Lone Gunman op 04-05-2012 19:38 ]

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Acties:
  • 0 Henk 'm!

  • SMGGM
  • Registratie: Januari 2006
  • Laatst online: 11-09 17:29
Thanks Lone Gunman, dat heeft het inderdaad gedaan ;)
Iedereen bedankt voor de raad, kan nog van past komen gezien dit maar het eerste deel is. Uiteindelijk ga ik het wat uitbreiden tot een eigen betaling generator.

De validator op zich is wel al klaar en werkt fantastisch ;)
Afbeeldingslocatie: http://img526.imageshack.us/img526/4681/prtscr03.png

Nogmaals bedankt voor de hulp
Pagina: 1