Newsgroup: it.comp.java
Titolo: XML: Generazione di un DOM con API Java

Ciao a tutto il NG,
ho il seguente problema:
Sto scrivendo una classe che trasforma un oggetto Java in una stringa XML.
Il protocollo di conversione e' definito in un DTD contenuto in un file locale.
Il mio problema e' che, in fase di conversione, a partire dall'oggetto,
costruisco un DOM (che poi serializzo in una stringa XML)in questo modo:
Document doc = new DocumentImpl();
Element root = doc.createElement(..nome del tag dell'elemento root ...); 
...
 
doc.appendChild(root);
...
Tuttavia, affinche' le stringhe XML che genero in questo modo possano essere
validate utilizzando il DTD, devo aggiungere al DOM (prima del nodo
corrispondente all'elemento root) un nodo corrispondente a questo tag:
<!DOCTYPE mioOggetto SYSTEM="mioDTDfile">
Purtroppo la mia esperienza con XML e' di 1 giorno (progetto in forte ritardo
:-D), cosicche'non sono riuscito a trovare nei javadoc di org.w3c.dom un metodo
apposito per fare cio'. Qualcuno di voi saprebbe gentilmente dirmi se tale
metodo esiste ?
Ringrazio in anticipo, e se sono OT mandatemi pure al diav ... ehm, al NG piu'
appropriato :-D
Ciao !
-- 
Posted from  [212.141.87.12] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

apposito per fare cio'
Bisogna prestare un po' di attenzione perché in molti casi si usano
factory e builder... per nascondere le implementazioni.
HTH
-- 
Ciao
	Fabrizio C.

 ...
Ciao e innanzitutto grazie per la risposta :-D
Ho provato il codice. All'esecuzione mi lancia una eccezione
(originata da una DOMException) con questo messagggio:
Couldn't create XML serialization of given object: DOMException - DOM006
Hierarchy request error
O e'la createDocumentType o e'la createDocument.
(In realta' potrebbero essere anche quelle dopo, ma prima
 - quando non dovevo fare la validazione con DTD - non mi davano problemi)
Il fatto e' che la createDocumentType() mi richiede un "publicId" e un
"systemId":
per "systemId" ho usato il nome del mio DTD, ma per "publicId" non avevo idea
di cosa
metterci (esperienza con XML 2 giorni, compreso ieri :-D), cosi' ho messo "".
Lo stesso dicasi per createDocument() che vuole un "namespaceURI". Io ci ho
messo
"
http://www.w3.org/XML/1998/namespace
" scopiazzandolo da chissa' dove (forse da
un javadoc)
Provo a postare il codice del metodo che avvia la creazione del DOM:
<CODE>
	/**
	 * Utility method for encoding of Java objects into XML strings
	 *
	 * @param	An object instance of a Java Class 
	 * @return	A XML string representing the given object
	 */	
	public String xmlFactory(Object obj) throws IMDataException {
		try {	
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			DOMImplementation dom = db.getDOMImplementation();
			DocumentType dt = dom.createDocumentType("IMData", "", "imvp-protocol.dtd");
			Document doc =
dom.createDocument("
http://www.w3.org/XML/1998/namespace
","IMData", dt); //
altro modo?
			// Create Root Element
			Element root = doc.createElement(IMDataProtocolConstants.OBJECT_TAG_NAME); 
			root.setAttribute(IMDataProtocolConstants.OBJECT_ATTR_VERSION,
IMDataProtocolConstants.OBJECT_VALUE_CURRENT_VERSION);
			root.setAttribute(IMDataProtocolConstants.OBJECT_ATTR_COMPATIBLE,
IMDataProtocolConstants.OBJECT_VALUE_CURRENT_COMPATIBILITY);
 
			doc.appendChild(root);             // Add Root element to Document
 
			addGenericElement(doc, root, obj); // Attach next elements to Root element
(RICORSIVO)
 
			OutputFormat  format  = new OutputFormat(doc); //Serialize DOM
			format.setEncoding(IMDataProtocolConstants.OBJECT_VALUE_CURRENT_ENCODING);
			StringWriter  stringOut = new StringWriter();  //Writer will be a String
			XMLSerializer serial = new XMLSerializer(stringOut, format);
			serial.asDOMSerializer();                      // As a DOM Serializer
 
			serial.serialize(doc.getDocumentElement());
 
			return stringOut.toString(); // Spit out DOM as a String
 
		} catch (FactoryConfigurationError ex) {
 
			throw new IMDataException("Couldn't create XML serialization of given
object: FactoryConfigurationError - ", ex);
 
		} catch (ParserConfigurationException ex) {
 
			throw new IMDataException("Couldn't create XML serialization of given
object: ParserConfigurationException - ", ex);
 
		} catch (DOMException ex) {
 
			throw new IMDataException("Couldn't create XML serialization of given
object: DOMException - ", ex);
 
		} catch (Exception ex) {
 
			throw new IMDataException("Couldn't create XML serialization of given
object: ", ex);
		} 		
	}
</CODE>
Grazie nuovamente e a presto !!! :-D


 
Grazie !!!
Mi e' bastato sostituire la mia 
	Document doc = new DocumentImpl();
con 
	Document doc = new DocumentImpl(dt);
e ha funzionato !!! Grazie !!! Ciao !!!			


e ha funzionato !!!
Stavo provando un'altra via (un po' più contorta), ma, se hai risolto,
meglio. :-)
-- 
Ciao
	Fabrizio C.