Hallo,
ich würde gern die Korrektheit einer XML-Datei mittels einer Schema-Datei prüfen. Zum Einlesen der XML-Datei benutze ich DOM.
Meine XML Datei:
<?xml version="1.0" encoding="UTF-8"?> <Beschreibung xmlns="http://www.person.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.person.de mySchema.xsd"> <Vater name="Peter" alter="40"> <Kind name="Ralf" alter="10"/> <Kind name="Markus" alter="15"/> </Vater> </Beschreibung>
Die Schema-Datei:
<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.person.de" xmlns="http://www.person.de"> <xs:element name="Beschreibung"> <xs:complexType> <xs:sequence> <xs:element ref="Vater" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Vater"> <xs:complexType> <xs:sequence> <xs:element ref="Kind" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> <xs:attribute name="name" type="xs:string" use="required" /> <xs:attribute name="alter" type="xs:string" use="required" /> </xs:complexType> </xs:element> <xs:element name="Kind"> <xs:complexType> <xs:attribute name="name" type="xs:string" use="required" /> <xs:attribute name="alter" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema>
Die Programme "XML-Spy" und "XML Copy Editor" sagen beide, dass die XML Datei valide ist, nur mein Programm scheint das nicht zu merken.
Fehlerausgabe beim Öffnen der XML Datei in meinem Java-Programm:
"org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'Beschreibung'."
Mein Java-Code zum Einlesen und Überprüfen einer XML-Datei:
try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(file); //Validierung gegen Schema SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); File schemata = new File("mySchema.xsd"); Schema f = sf.newSchema(schemata); Validator v = f.newValidator(); v.validate(new DOMSource(doc.getDocumentElement())); } catch (SAXParseException e) { e.printStackTrace(); }
Ich hab keine Ahnung wo mein Fehler liegt...hoffe mir kann wer helfen.
Ich möchte auch bei DOM bleiben und nicht auf SAX oder JDOM etc. umschwenken.
Anscheinend wird ja versucht zu validieren, nur halt nicht richtig.