Newsgroup: it.comp.java
Titolo: compattare xml

Gli utenti mi passano in un forum il contenuto di un file xml tipo:
<content><!-- Title -->
		<data-block>
			<table>
				prova 
			</table>
		</data-block>
	</content>
Io vorrei ottenere una stringa java che elimina i commenti e compatta, in
questa maniera:
<content><data-block><table>prova</table></data-block></content>
quale � il metodo migliore?
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Grazie
correggo
forum=form html
grazie



Gli spazi li togli con la trim, per i commenti o un parser o uno
string tokenizer. Vedi la documentazione della classe String

 string tokenizer. Vedi la documentazione della classe String
Tempo fa usavo dom4j. È molto comodo, fai il parsing del domunento con
sax parser ed ottieni un oggetto document.
Quest'ultimo ha tutti i metodi per manipolare il DOM, tra cui anche un
metodo che scrive l'xml usando una particolare logica di compressione
degli spazi e stili di indentazione. Il comportamento di default e
quello che fa al caso tuo.
In totale ci sono da copiare dal dito una decina di righe di codice,
forse meno. La cosa utile é che in questo modo hai anche validato il
tuo documento.
Purtroppo sono col cellulare e non ho sottomano i riferimenti, ma
credo che google ti dica tutto al volo.
Ciao, davide.

> In totale ci sono da copiare dal dito una decina di righe di codice,
Dal sito, non dal dito...

> Grazie
usare il metodo replaceAll(">\\s+<", "") della classe String?

 usare il metodo replaceAll(">\\s+<", "") della classe String?
No, l'OP vuol togliere anche i commenti e quello lo fai solo con un 
parser XML. SAX o DOM, che valuti lui.

 quale il metodo migliore?
quello più semplice, ovvero utilizzando sax. parsi il documento, nel
tuo handler implementi la banale logica di trasformazione.


Se apri l'xml col Jdom, poi lo salvi mediante un XMLOutputter creato con 
un format tipo: 
Format.getCompactFormat().setIndent(null).setTextMode(Format.TextMode.TRIM)
toglie tutti gli indent e fa il trim dei whitespace.
-- 
Dr. Ugo Gagliardelli, Modena, Italy
Spaccamaroni andate a cagare/Spammers not welcome

 toglie tutti gli indent e fa il trim dei whitespace.
Cosï¿œ perï¿œ non rimuove i commenti.
Dovrebbe anche identificare gli elementi "Comment" e rimuoverli dal 
documento con "Document.removeContent(Content child)".
Personalmente preferisco la soluzione di rootkit, sarï¿œ che di solito 
lavoro con file XML pesanti e DOM non ï¿œ decisamente l'ideale.


giusto, mi ero dimenticato dei commenti:
come prima e poi usando replaceAll("<!--.+?-->", "") ?



augurandosi che il documento non contenga cdata.

 come prima e poi usando replaceAll("<!--.+?-->", "") ?
Come soluzione mi convince poco: se poi l'OP si accorge che un 
particolare nodo non gli serve? E se volesse accorpare dei nodi, 
verificare la validazione, rinominare dei nodi o cambiare l'output?
Altri replaceAll o operazioni su stringhe? :-?
Personalmente preferisco le soluzioni semplici senza inutili 
sovradimensionamenti, quindi capisco bene il tuo punto di vista.
Ma tra l'estensione di una classe con l'overload di due metodi, da un 
lato, e una serie di replaceAll (e non solo) dall'altro, non vedo grosse 
differenze a livello di complessità di codice.
Con l'indubbio vantaggio che la prima soluzione è decisamente più 
scalabile e personalizzabile. Nonché "adatta": SAX è nato per gestire 
XML, String per le stringhe ;-)
P.S.: ad occhio la re che hai scritto non funzionerebbe con i commenti 
multilinea. Non ho verificato ma il . (dot) non comprende i \r o \n.


anche se li contenesse la regex non li cancella
--
sv.

 multilinea. Non ho verificato ma il . (dot) non comprende i \r o \n.
si effettivamente per il multilinea ed eventuali caratteri UNICODE �:
"(?su)<!--.+?-->"
aggiungo anche una correzione ">\\s+<" non toglie gli spazi prima e dopo 
il testo "Prova".
--
sv.

 anche se li contenesse la regex non li cancella
ma all'interno dei cdata potresti trovare (ed è perfettamente lecito)
dei match che ovviamente non devi cancellare.

 il testo "Prova".
Se fosse scritto:
<table>
   prima
   prova
</table>
(o un qualunque testo più complesso)?

 lavoro con file XML pesanti e DOM non ï¿œ decisamente l'ideale.
Siamo perfettamente d'accordo che per XML pesanti il DOM mal si adatta, 
ma poiche' l'OP dice che vuole ottenere una "stringa Java", direi che 
qualsiasi cosa sottostia ai limiti di dimensioni di un oggetto String, 
allora possa adattarsi perfettamente anche al DOM.
