Avatar billede obix Nybegynder
11. marts 2008 - 22:37 Der er 11 kommentarer og
1 løsning

Schematron validering java

Hejsa.

Hvordan validerer jeg et xml document med denne
http://rep.oio.dk/ubl/xml/schemas/0p71/schematron/OIOEfakturaSchematron.xsl ?

Jeg forsøger mig lige nu med

SchemaFactory schemaFacotry = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
//schematronSchemaSource Streamsource med xsllen der skal valideres med
Schema schema = schemaFacotry.newSchema(schematronSchemaSource);
//Inputsource med xmllen der skal valideres
schema.newValidator().validate(new SAXSource(is));

Ovenstående giver bare følgende fejl.

Det er meget vigtigt at det performer da der skal valideres mange både store og små dokumenter.

GenericDocumentException: app=1.10,err=3.0([org.apache.xerces.impl.xs.XMLSchemaLoader: method loadGrammar([Lorg/apache/xerces/xni/parser/XMLInputSource;)V not found])
    at dk.company.genericdocumentprocess.documentdata.OIOInvoiceValidator.schematronValidate(OIOInvoiceValidator.java:152)
    at dk.company.genericdocumentprocess.documentdata.OIOInvoiceValidator.validateDocument(OIOInvoiceValidator.java:60)
    at dk.company.junits.TestXml.testOIOInvoiceValidator(TestXml.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:60)
    at java.lang.reflect.Method.invoke(Method.java:391)
    at junit.framework.TestCase.runTest(TestCase.java:166)
    at junit.framework.TestCase.runBare(TestCase.java:140)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:131)
    at junit.framework.TestSuite.runTest(TestSuite.java:173)
    at junit.framework.TestSuite.run(TestSuite.java:168)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186)
Caused by: java.lang.NoSuchMethodError: org.apache.xerces.impl.xs.XMLSchemaLoader: method loadGrammar([Lorg/apache/xerces/xni/parser/XMLInputSource;)V not found
    at org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
    at javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
    at dk.company.genericdocumentprocess.documentdata.OIOInvoiceValidator.schematronValidate(OIOInvoiceValidator.java:112)
    at dk.company.genericdocumentprocess.documentdata.OIOInvoiceValidator.validateDocument(OIOInvoiceValidator.java:60)
    at dk.company.junits.TestXml.testOIOInvoiceValidator(TestXml.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:60)
    at java.lang.reflect.Method.invoke(Method.java:391)
    at junit.framework.TestCase.runTest(TestCase.java:166)
    at junit.framework.TestCase.runBare(TestCase.java:140)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:131)
    at junit.framework.TestSuite.runTest(TestSuite.java:173)
    at junit.framework.TestSuite.run(TestSuite.java:168)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186)
Avatar billede obix Nybegynder
11. marts 2008 - 22:50 #1
Hmm hold lige igen med at skrive. Jeg har først lige nu set at dokumentet egentlig bare er en xsl til transformering... og ud fra transformeringen kan man så se om der er nogle fejl.....
Avatar billede obix Nybegynder
11. marts 2008 - 22:58 #2
Er det mig der har misforstået noget eller er det lidt en underlig måde at validere på?
Avatar billede arne_v Ekspert
12. marts 2008 - 00:03 #3
.xsl er til transformering - det er .xsd der er til validering

den .xsl er iøvrigt ret grim og svær at læse - laver den en "soft" validering ??
Avatar billede obix Nybegynder
12. marts 2008 - 07:36 #4
Sådan som det er lavet lige nu laver man en transformering vha. den xsl så tjekker man på om der er en "error" i det dokument der kommer ud af det men det performer rigtig dårligt. Jeg bliver vel nød til at skrive det om til noget rigtig validering.

Et dokument på 3mb tager over 100 sekunder at "validere" vha. ovenstående.
Avatar billede obix Nybegynder
12. marts 2008 - 22:14 #5
Jeg har nu forsøgt med xalan transformering og saxon transformering men ingen af de nævnte får det til at gå hurtigere. Eller dvs. hvis jeg skifter til saxon barberer jeg nogle få sekunder af. Jeg skifter mellem dem ved at sætte følgende.

java.lang.System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
//java.lang.System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
       
Er der andet man kan gøre for at speede det op?
Avatar billede arne_v Ekspert
13. marts 2008 - 02:12 #6
Hele ideen sucks big time.

Men du hænger jo nok lidt på den.

Mit bedste bud på en optimering er:

http://xml.apache.org/xalan-j/xsltc_usage.html
Avatar billede nielle Nybegynder
13. marts 2008 - 18:31 #7
12/03-2008 00:03:51> Det skræmmende er nok at det såmæn er vore egen IT og Telestyrelsen som har defineret filen:

http://www.itst.dk/arkitektur-og-standarder/oio-arbejdet-offentlig-information-online
Avatar billede obix Nybegynder
13. marts 2008 - 18:59 #8
Hehe ja. Det skal man nu nok ikke tænke så meget over. =)
Avatar billede arne_v Ekspert
14. marts 2008 - 02:26 #9
Dem der laver OIO er jo også kun mennesker.

De tester den XSL på en 3 KB XML fil og "den virker jo fint".

Eller de ved at den er lidt ulden, men den blev lavet som en midlertidig løsning
for at komme videre hurtigt og lige pludselig er deadline så tæt på at der ikke
er tid til en anden løsning.

Eller 117 andre ting.

Som Bent Larsen engang sagde: man skal se meget for at slide hul i brille glassene !
Avatar billede arne_v Ekspert
14. marts 2008 - 02:26 #10
Har du prøvet med xsltc ?
Avatar billede obix Nybegynder
18. marts 2008 - 20:16 #11
Arne du har da helt ret. Vi har alle lavet noget skrammel.

Faktisk så har jeg ændret lidt i koden og nu validerer jeg et 117mb dokument på under 4 sekunder.

Problemet var at xmllen blev læst ind i hukommelsen i et Document jeg har ændret så jeg læser xmllen (byte[]) ind i en InputSource. Det har gjort hele forskellen. Så har jeg skiftet xsllen ud med en nyere version it og telestyrelsen havde lavet og det gav også en del.

Vil du lige ligge et svar så du kan få point.
Avatar billede arne_v Ekspert
18. marts 2008 - 20:48 #12
ok
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