Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

compattare xml

81 views
Skip to first unread message

Jack 81

unread,
Feb 8, 2011, 6:19:20 AM2/8/11
to
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


Jack 81

unread,
Feb 8, 2011, 6:21:02 AM2/8/11
to
Jack 81 ha scritto:

> 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

daniele.d...@gmail.com

unread,
Feb 8, 2011, 7:21:35 AM2/8/11
to

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

Davide

unread,
Feb 9, 2011, 5:05:05 AM2/9/11
to
On 8 Feb, 13:21, "Daniele.Donnaru...@gmail.com"

<daniele.donnaru...@gmail.com> wrote:
> On 8 Feb, 12:21, Jac...@gnail.com (Jack 81) wrote:
>
>
>
>
>
> > Jack 81 ha scritto:
>
> > > 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
>
> > --
>
> > questo articolo e` stato inviato via web dal servizio gratuitohttp://www.newsland.it/newssegnalagli abusi ad ab...@newsland.it

>
> 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.

Davide

unread,
Feb 9, 2011, 5:09:31 AM2/9/11
to
> In totale ci sono da copiare dal dito una decina di righe di codice,
Dal sito, non dal dito...

sv

unread,
Feb 10, 2011, 1:50:46 PM2/10/11
to
On 08/02/2011 12.21, Jack 81 wrote:
> Jack 81 ha scritto:
>
>> 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


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

Pablo

unread,
Feb 11, 2011, 3:27:34 AM2/11/11
to
Il 10/02/2011 19:50, sv ha scritto:
> 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.

rootkit

unread,
Feb 11, 2011, 6:12:36 AM2/11/11
to
On 8 Feb, 12:19, Jac...@gnail.com (Jack 81) wrote:

> 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

unread,
Feb 11, 2011, 12:24:33 PM2/11/11
to
il 08.02.2011 12.19, Scrive Jack 81 65181216:

> 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
>
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

Pablo

unread,
Feb 12, 2011, 4:20:33 AM2/12/11
to
Il 11/02/2011 18:24, Dr.Ugo Gagliardelli ha scritto:
> 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.

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.

sv

unread,
Feb 12, 2011, 7:40:44 AM2/12/11
to

giusto, mi ero dimenticato dei commenti:

come prima e poi usando replaceAll("<!--.+?-->", "") ?

rootkit

unread,
Feb 12, 2011, 11:15:25 AM2/12/11
to

augurandosi che il documento non contenga cdata.

Pablo

unread,
Feb 12, 2011, 11:27:31 AM2/12/11
to
Il 12/02/2011 13:40, sv ha scritto:
> 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.

sv

unread,
Feb 13, 2011, 7:17:29 AM2/13/11
to

anche se li contenesse la regex non li cancella

--
sv.

sv

unread,
Feb 13, 2011, 7:28:51 AM2/13/11
to
On 12/02/2011 17.27, Pablo wrote:
> Il 12/02/2011 13:40, sv ha scritto:
>> 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? :-?


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.

rootkit

unread,
Feb 13, 2011, 11:02:09 AM2/13/11
to
On 13 Feb, 13:17, sv <s...@sv.com> wrote:

> >> 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.

Pablo

unread,
Feb 13, 2011, 12:07:16 PM2/13/11
to
Il 13/02/2011 13:28, sv ha scritto:
> Per quanto avevo capito all'OP interessava
> solo eliminare gli spazi inutili, non manipolare la struttura dell'XML.

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)?

Dr.Ugo Gagliardelli

unread,
Feb 14, 2011, 5:48:54 AM2/14/11
to
il 12.02.2011 10.20, Scrive Pablo 61475008:

> Il 11/02/2011 18:24, Dr.Ugo Gagliardelli ha scritto:
>> 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.
>
> Cosᅵ perᅵ non rimuove i commenti.
> Dovrebbe anche identificare gli elementi "Comment" e rimuoverli dal
> documento con "Document.removeContent(Content child)".
Gia' me ne sono dimenticato.
A tal proposito si puo' usare anche un Filter ed utilizzarlo in un
metodo ricorsivo, grosso modo l'intero processo dovrebbe essere circa cosi':
class CleanXml {
static Filter
fc = new Filter() {
matches(Object obj) {
return obj!= null && (obj instanceof Comment);
}
},
fe = new Filter() {
matches(Object obj) {
return obj!= null && (obj instanceof Element);
}
};
public static String xmlString(String filexml) {
File fx = new File(file.xml);
SAXBuilder builder = new SAXBuilder();
Document p = builder.build(fx);
Format fo = Format.getCompactFormat()
.setIndent(null)
.setTextMode(Format.TextMode.TRIM);
XMLOutputter out = new XMLOutputter(fo);
Detach .detachComment(p);
out.output(p, new FileOutputStream(fx));
byte[] b = new byte[(int)fx.length()];
int size = new FileInputStream(fx).read(b));
return new String(bytes, 0, size);
}
static void detachComment(Parent p) {
for(Comment c: p.getDescendants(fc))
c.detach();
for(Element e: p.getDescendants(fe))
detachComment(e);
}

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.

0 new messages