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
> 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
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
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.
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.
> 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?
quello più semplice, ovvero utilizzando sax. parsi il documento, nel
tuo handler implementi la banale logica di trasformazione.
--
Dr. Ugo Gagliardelli, Modena, Italy
Spaccamaroni andate a cagare/Spammers not welcome
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 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.
questo � un altro discorso. Per quanto avevo capito all'OP interessava
solo eliminare gli spazi inutili, non manipolare la struttura dell'XML.
> 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 ;-)
non discuto sul fatto che SAX e DOM sono i metodi corretti di manipolare
l'XML, solo che per alcune trasformazioni di formattazione (come
indentazione ad esempio), che non intaccano la struttura, si possono
fare anche con altri strumenti.
> 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.
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.
> >> come prima e poi usando replaceAll("<!--.+?-->", "") ?
>
> > augurandosi che il documento non contenga cdata.
>
> 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.
Ti sarà sfuggito, l'aveva scritto ben chiaro della rimozione dei
commenti. :)
> non discuto sul fatto che SAX e DOM sono i metodi corretti di manipolare
> l'XML, solo che per alcune trasformazioni di formattazione (come
> indentazione ad esempio), che non intaccano la struttura, si possono
> fare anche con altri strumenti.
Attenzione però che l'indentazione dei tag è una cosa, quella del
contenuto degli stessi è cosa ben diversa.
Una generica replace dei caratteri di spazi, tabulatori e "a capo" (\r
e/o \n) altera anche il contenuto dei tag, in modo significativo (e
*non* prevedibile, visto che il contenuto è generato da un utente).
> aggiungo anche una correzione ">\\s+<" non toglie gli spazi prima e dopo
> il testo "Prova".
Se fosse scritto:
<table>
prima
prova
</table>
(o un qualunque testo più complesso)?
da cui, a meno di tutte le exception, la stringa xml diventa:
String xml = CleanXml.xmlString("file.xml");
>
> Personalmente preferisco la soluzione di rootkit, sarᅵ che di solito
> 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.