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?