ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
4663
4663
EMPFEHLEN
-
Hallo zusammen,
ich benutze Java6 und habe versucht eine ganz simple Validierung eines XML Dokuments umzusetzen, stoße jedoch auf eine Wand! Ich habe den Code aus der JAPI genommen, welcher hier zu finden ist: KLICK
In etwa das Gleiche ist hier auch nochmal zu finden. Sogar mit Beispiel XML und Schemadokument.
Ich verwende den folgenden Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12
// 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. 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));
Mein Problem ist jetzt, dass die Validierung schiefgeht. Ich bekomme eine SAXParseException:
Code :1
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'birthdate'.
Ich habe viel im Internet gesucht, konnte jedoch keine Lösung finden, da ich scheinbar der Einzige bin, der dieses Problem hat.
Ich hoffe es kann mir jemand weiterhelfen.
Danke
-
Hallo,
könntest du mal bitte die XML-Datei und das Schema posten?
Es sieht für mich nämlich so aus, dass er in der XML-Datei ein Element findet, welches im Schema nicht definiert ist.
MFG
zEriXEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Die hab ich auch aus dem 2. Link genommen, da ich mit meinen die Probleme hatte. Aber mit denen vom Link siehts genau gleich aus:
XML:
Code :1 2 3 4 5 6 7
<?xml version="1.0"?> <birthdate> <month>January</month> <day>21</day> <year>1983</year> </birthdate>
Schema:
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"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:element name="birthdate"> <xs:complexType> <xs:sequence> <xs:element name="month" type="xs:string"/> <xs:element name="day" type="xs:int"/> <xs:element name="year" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
-
Hat denn niemand eine Idee / einen Tip?
-
21.09.07 09:49 #5
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
schau mal hier:
Code 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/** * */ package de.tutorials; import java.io.StringReader; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; /** * @author Thomas.Darimont * */ public class XmlSchemaValidationExample { /** * @param args */ public static void main(String[] args) throws Exception { String schema = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" + "<xs:import namespace=\"http://www.w3.org/XML/1998/namespace\" schemaLocation=\"http://www.w3.org/2001/xml.xsd\"/>" + "<xs:element name=\"birthdate\">" + "<xs:complexType>" + "<xs:sequence>" + "<xs:element name=\"month\" type=\"xs:string\"/>" + "<xs:element name=\"day\" type=\"xs:int\"/>" + "<xs:element name=\"year\">" + "<xs:simpleType>" + "<xs:restriction base=\"xs:int\">" + "<xs:minInclusive value=\"1950\"></xs:minInclusive>" + "<xs:maxInclusive value=\"2400\"></xs:maxInclusive>" + "</xs:restriction>" + "</xs:simpleType>" + "</xs:element>" + "</xs:sequence>" + "</xs:complexType>" + "</xs:element>" + "</xs:schema>"; String validXml = "<?xml version=\"1.0\"?>" + "<birthdate>" + "<month>January</month>" + "<day>21</day>" + "<year>1983</year>" + "</birthdate>"; String invalidXml = "<?xml version=\"1.0\"?>" + "<birthdate>" + "<month>January</month>" + "<day>21</day>" + "<year>3000</year>" + "</birthdate>"; Validator validator = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema( new StreamSource(new StringReader(schema))).newValidator(); validator.validate(new StreamSource(new StringReader(validXml))); System.out.println("#####"); validator.validate(new StreamSource(new StringReader(invalidXml))); } }
Ausgabe:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
##### Exception in thread "main" org.xml.sax.SAXParseException: cvc-maxInclusive-valid: Value '3000' is not facet-valid with respect to maxInclusive '2400' for type '#AnonType_yearbirthdate'. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:410) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3165) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3068) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:2978) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2121) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:791) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1772) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2923) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:645) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144) at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:107) at javax.xml.validation.Validator.validate(Validator.java:127) at de.tutorials.XmlSchemaValidationExample.main(XmlSchemaValidationExample.java:53)
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hi Tom,
danke Dir für die Antwort. Dein Code funktioniert soweit. Ich konnte es jetzt soweit abstahieren, dass ich rausgefunden habe, dass mein Code im Bereich
Code :1
validator.validate(new DOMSource(document));
Probleme macht. Wenn ich deinen xml Datei als String an den Validator gebe funktioniert der Rest meiner Methode auch. Nur als DOMSource Objekt kann ich scheinbar nicht übergeben. Ich bin noch am Anaysieren, vlt. hat ja aber jemand noch nen Tip.
Das Dokument lese ich mit fogendem Code ein:
Code :1 2 3 4 5 6 7
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document myDocument = builder.parse(new File("C:\\datei.xml")); ...
Gruß, DenisGeändert von HuberDe (21.09.07 um 13:48 Uhr)
-
Hallo,
ich habe versucht anhand des oben stehenden Beispiels eine Validierung durchzuführen und scheitere wohl im moment an den Namespaces.
Es hat zwar funktioniert der SchemaFactory meinen Namespace mitzugeben, allerdings scheitere ich im Moment daran, dass mein Schema ein weiteres Schema includiert. Die beiden Schemata liegt zwar im selben Namespace, aber trotzdem scheint es beim includierten Probleme zu geben. Jetzt hab ich keine Idee wie ich den Namespace des inludierten bekannt machen könnte.
bin für jeden Tipp dankbar
Gruß Philipp
-
Die Lösung ist recht einfach. Liest man die Dateien (Schema und XML-Datei) über ein StreamSource Objekt ein, funktioniert alles einwandfrei.
Gruß, Denis
-
09.04.08 14:48 #9
- Registriert seit
- Apr 2008
- Beiträge
- 8
hallo
habe das beispiel auch mal implementiert und siehe da es geht... habe es auch mit externen dateien hinbekommen.
habe mir mal zum test ne xml und passende xsd gebaut, wo default werte enthalten sind, also die xml ja irgendwie automatisch gefüllt werden muss.
nun habe ich das problem den bogen zu finden wie ich einen validierten DOM mit default werten erstelle...
hat einer ne ahnung
Ähnliche Themen
-
Validierung
Von brainsucker im Forum HTML & XHTMLAntworten: 1Letzter Beitrag: 07.02.08, 13:39 -
libxml2 und validierung mit XSD
Von Maxik25 im Forum C/C++Antworten: 0Letzter Beitrag: 28.12.07, 11:51 -
Email Validierung
Von splat im Forum PHPAntworten: 3Letzter Beitrag: 23.07.07, 20:39 -
W3C Validierung
Von Tonda im Forum HTML & XHTMLAntworten: 3Letzter Beitrag: 01.05.05, 14:16 -
CSS Validierung?
Von Admi im Forum CSSAntworten: 6Letzter Beitrag: 09.02.05, 17:34





Zitieren


Login





