Buongiorno a tutti, come da titolo ho un problema con il parser SAX per l'XML.
La mia applicazione serve per gestire una libreria, sto aggiungendo una funzionalità per importare/esportare i database in XML.
Ho creato anche un file DTD che dovrebbe garantirmi la formattazione corretta.
Ora il problema: quando cerco di importare il file XML viene lanciata un'eccezione
java.io.IOException: org.xml.sax.SAXParseException: Open quote is expected for attribute "nameDB" associated with an element type "DATABASE".
A prima vista potrei pensare che mancano le virgolette quando cerco di leggere gli attributi del tag DATABASE, in realtà le virgolette ci sono.
Qui sotto vi posto il DTD e l'XML che viene generato automaticamente quando faccio l'esportazione dalla mia applicazione.
File DTD (chiamato DTDdatabase.dtd):
codice:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT DATABASE (LOGICALBOOK*,PHYSICALBOOK*,PERSON*,TAG*,LANGUAGE*,ROLE*,PUBLISHER*,SERIES*,STATUS*,CATEGORY*, LOGBOOK_TAG*,LOGBOOK_LANG*,LOGBOOK_PERSON*,NLOGY_OPERA*,LOGBOOK_PHYBOOK*,COLLECTION_VOLUME*, PHYBOOK_CAT*,PHYBOOK_LANG*,PHYBOOK_PERSON*)>
<!ATTLIST DATABASE nameDB CDATA #REQUESTED >
...
Al posto dei puntini ci sono tutte le definizioni dei TAG che rappresentano le tabelle elencate qui sopra.
File XML:
codice:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DATABASE SYSTEM "DTDdatabase.dtd">
<DATABASE nameDB="MyLibrary">
<LOGICALBOOK>
<IDLBOOK>1</IDLBOOK>
<TITLE>The Lord of the Rings</TITLE>
...
Anche qui ci sarebbero tutte le info che però penso siano superflue.
In caso vi servano i file interi posso caricarli da qualche parte per evitare un'enormità di pagina.
Il codice JAVA che ho usato per leggere è questo:
codice:
String path = s;
LookupHandler h = new LookupHandler();
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(true); // enable the use of DTD
spf.setNamespaceAware(false);
try {
SAXParser sp = spf.newSAXParser();
sp.parse(path, h);
if (h.hadProblems()) {
System.out.println("Document doesn't contain fatal error");
}
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
System.exit(10);
} catch (SAXException sxe) {
//System.out.println("Document contains fatal error");
try {
throw new IOException(sxe);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LookupHandler è la classe con i metodi startElement, endElement e characters che il SAX usa per capire quando un tag è aperto o meno.
Qualcuno riesce a capire cosa non va?