Avatar billede janegil Nybegynder
21. februar 2003 - 14:39 Der er 11 kommentarer og
1 løsning

Hvordan validere XML i batch-job?

Jeg har en .bat-fil, der jeg bruker Sablotron til å transformere noen XML-filer.

Kan noen hjelpe meg å finne et verktøy som kan validere en XML-fil mot et XML Schema fra en batch-job? Helst noe som virker uten av skjemaet er referert i selve XML-fila.
Avatar billede arne_v Ekspert
21. februar 2003 - 14:55 #1
Du kan skrive et Java program der kan gøre det på < 20 linier.
Avatar billede janegil Nybegynder
21. februar 2003 - 15:07 #2
Jeg burde kanskje tilføye at dokumentene er opp til 22MB, jeg kanforestille meg at Javaprogrammer kan få problemer med det?
Avatar billede arne_v Ekspert
21. februar 2003 - 15:16 #3
Ikke nødevendigvis.

En DOM parser vil nok bruge en del RAM til 22 MB XML.

Men en SAX parser burde være helt uproblematisk.

NB: For at validere mod schema skal du have en JAXP 1.3 !
Avatar billede arne_v Ekspert
21. februar 2003 - 22:13 #4
Et lille eksempel:

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

public class ValWithSaxAndSchema {
    static final String JAXP_SCHEMA_LANGUAGE =
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    static final String W3C_XML_SCHEMA =
        "http://www.w3.org/2001/XMLSchema";
    static final String JAXP_SCHEMA_SOURCE =
        "http://java.sun.com/xml/jaxp/properties/schemaSource";
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            factory.setValidating(true);
            SAXParser saxParser = factory.newSAXParser();
            saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
            saxParser.setProperty(JAXP_SCHEMA_SOURCE, new File(args[1]));
            saxParser.parse(new File(args[0]), new ValHandler());
        } catch (SAXNotRecognizedException e) {
            e.printStackTrace();
        } catch (SAXNotSupportedException e) {
            e.printStackTrace();
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ValHandler extends DefaultHandler {
    public void error(SAXParseException e) {
        e.printStackTrace();
    }
    public void warning(SAXParseException e) {
        e.printStackTrace();
    }
}
Avatar billede arne_v Ekspert
21. februar 2003 - 22:14 #5
javac -classpath ... ValWithSaxAndSchema.java
java -classpath ... ValWithSaxAndSchema minxml.xml minxsd.xsd

skulle virke.

classpath afhænger af din opsætning.
Avatar billede arne_v Ekspert
21. februar 2003 - 22:15 #6
Og det er JAXP 1.2 ikke 1.3 (1.3 er vist ikke releaset endnu).

JAXP 1.2 kan hentes som en del af XML Summer Pack fra http://java.sun.com/.
Avatar billede arne_v Ekspert
26. februar 2003 - 23:16 #7
Kunne du bruge det ?
Avatar billede janegil Nybegynder
27. februar 2003 - 15:17 #8
Må tilstå at jeg ikke har prøvd ennå - sitter på gjerdet og håper på en .exe-fil.

Har litt paranoia for Java - det er alltid noe tull med classpath og versjoner og sånt før det virker.
Avatar billede janegil Nybegynder
31. marts 2003 - 12:59 #9
Avatar billede pelyja Nybegynder
19. marts 2005 - 01:31 #10
Hej Arne

har lige prøvet ovenstående program, men får en StackOverflowError ved et lille simpelt eksempel.
Ved du, hvad det skyldes?

Peter
Avatar billede arne_v Ekspert
19. marts 2005 - 01:35 #11
Har du en stack trace ?
Avatar billede pelyja Nybegynder
19. marts 2005 - 01:40 #12
Nej

Jeg har lige tilføjet:

catch (StackOverflowError e){
          e.printStackTrace();
        }

Jeg får kun: java.lang.StackOverflowError
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester