Newsgroup: it.comp.java
Titolo: XML, Dom e DTD...

Salve gente,
in un programma che sto facendo ho l'esigenza di salvare una struttura ad
albero in un file xml. Allo scopo ho trovato comodo e semplice da usare il
sistema dom, ma ho un problemino: io creo la struttura dom via codice (non
leggendola da un file), e poi la salvo su un file utilizzando un
"transformer". Quello che vorrei fare è associare alla struttura dom la
dichiarazione "doctype" per specificare un dtd, ma non riesco a farlo.
Nonostante girellando tra le varie api dom abbia trovato vari riferimenti al
doctype (c'è un'interfaccia doctype, un'interfaccia domimplementatione che
definisce un metodo per ottendere un documento con un certo doctype,
ecc...), non sono riuscito a trovare classi o metodi per definire/modificare
il "doctype" di un documento, e in molti posti della documentazione ho
trovato frasi del tipo "DOM 1.0 non supporta l'editing della proprietà
doctype".
Infine vi chiedo: questa frase vuol dire che non si può definire il doctype,
o solo che non lo si può cambiare una volta associato ad un documento? In
entrambi i casi, come posso fare per definire il doctype del mio documento?
Grazie
Giacomo

 come posso fare per definire il doctype del mio documento?
Prova a far girare questo:
//---------
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
public class DocType
{
   public static void main(String[] args) throws Exception
   {
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     DocumentBuilder db = dbf.newDocumentBuilder();
     DOMImplementation di = db.getDOMImplementation();
     DocumentType dt = di.createDocumentType("test", null, "test.dtd");
     Document d = di.createDocument(null, "test", dt);
     TransformerFactory tf = TransformerFactory.newInstance();
     Transformer t = tf.newTransformer();
     t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, 
d.getDoctype().getSystemId());
     DOMSource s = new DOMSource(d);
     StreamResult r = new StreamResult(System.out);
     t.transform(s, r);
   }
}
//----------
Ciao,
Alberto
---
do...@mclink.it
---
JavaClass - Formazione Java e XML
java...@javaclass.it
http://www.javaclass.it

Ciao Alberto,
ti ringrazio per l'interessamento, ma bechè qualcosa si sia smosso, ancora
non ho risolto...  :-(
Infatti se ottengo il documento come da te suggerito (cioè dalla
DOMImlpementation invece che dal DocumentBuilder), quando arrivo ad
"appendere" il primo nodo (ottenuto da documentoXml.createElement() ) mi
lancia un'eccezione:
org.apache.crimson.tree.DomEx: HIERARCHY_REQUEST_ERR: nodo non consentito.
E non so perchè...
Per il momento sono stato costretto a generare il documentType la volo
quando faccio il setOutputProperty:
t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
domI.createDocumentType("layout",null,"layout.dtd").getSystemId());
Ma non è una soluzione che mi va, per una serie di motivi che non sto a
spiegarti per non appesantire il post (casomai se ti serve saere il perchè
chiedimelo e te lo spiego)... A me piacerebbe poter associare il docType
direttamente al documento come nel tuo codice! Solo che poi non riesco ad
aggiungere i nodi... perchè?
Grazie
Giacomo

 ... poi non riesco ad aggiungere i nodi...
Sospetto che tu appenda il primo nodo con qualcosa come:
document.appendChild(element);
Fai cosi', invece:
document.getDocumentElement().appendChild(element);


Funziona!! Sei un grande...
Non avevo capito che creando il documento così lui già crea il nodo root;
io, con la sintassi usata nella versione precedente, tentavo di aggiungere
un'altro root e lui ovviamente si arrabbiava... ora è tutto chiarao
(spero!).
Ti ringrazio
Ciao
Giacomo