2013-01-10 16 views
5

Consideriamo il seguente documento XML:removeChild(): come rimuovere anche il rientro?

<items> 
    <item>item1</item> 
    <item>item2</item> 
</items> 

Ora, cerchiamo di rimuovere tutti gli elementi e aggiungere qualche nuovo elemento. Codice:

//-- assume we have Element instance of <items> element: items_parent 
    // and the Document instance: doc 

    //-- remove all the items 
    NodeList items = items_parent.getElementsByTagName("item"); 

    for (int i = 0; i < items.getLength(); i++){ 
    Element curElement = (Element)items.item(i); 
    items_parent.removeChild(curElement); 
    } 

    //-- add a new one 
    Element new_item = doc.createElement("item"); 
    new_item.setTextContent("item3"); 
    items_parent.appendChild(new_item); 

Nuove contenuto del file:

<items> 


    <item>item3</item> 
</items> 

Queste righe vuote fastidiose apparso perché removeChild() rimuove bambino, ma lascia trattino del bambino rimosso, e la linea di rompere anche. E questo indent_and_like_break è trattato come un contenuto di testo, che è lasciato nel documento.

Nel related question ho postato soluzione:

items_parent.setTextContent(""); 

Si rimuove queste righe vuote. Ma questo è un nodo di hacking, rimuove l'effetto, non la causa.

Quindi, la domanda riguarda la rimozione della causa: come rimuovere il bambino con il suo intento con interruzione di riga?

+2

Controllare [questo] (http://stackoverflow.com/questions/978810/how-to-strip-whitespace-only-text-nodes-from-a-dom-before-serialization) – MadProgrammer

+0

Grazie, questo risolto il problema per me. Puoi aggiungere questo come una risposta, e lo accetterò. Oppure, la domanda non è effettivamente corretta, quindi, magari contrassegnarla come duplicata o addirittura cancellarla, non è sicuro .. –

+0

Se ti piace, vai a votare la domanda collegata – MadProgrammer

risposta

12

Il "rientro" prima dell'elemento e il "ritorno a capo" (e il seguente rientro) dopo sono nodi di testo. Se rimuovi un elemento e c'è un nodo di testo prima o dopo, naturalmente quei nodi non vengono rimossi.

Sembra come se si desidera rimuovere l'elemento e quindi anche rimuovere il nodo di testo davanti (a condizione che sia interamente costituito da spazi bianchi).

esempio forse in questo senso (nel ciclo rimozione di elementi):

Element curElement = (Element)items.item(i); 
// Start new code 
Node prev = curElement.getPreviousSibling(); 
if (prev != null && 
    prev.getNodeType() == Node.TEXT_NODE && 
    prev.getNodeValue().trim().length() == 0) { 
    items_parent.removeChild(prev); 
} 
// End new code 
items_parent.removeChild(curElement); 

Tuttavia, la vera domanda dovrebbe probabilmente essere il motivo per cui il documento XML ha estranei i nodi di testo spazi in esso.

+0

Grazie, la tua soluzione funziona per la rimozione reale del rientro prima dell'elemento! Ohh, sono confuso: mi hai dato una risposta esatta alla mia domanda, ma ora capisco che questo (il mio) approccio sembra essere hacky. Il mio male. Scusate. Non sono sicuro di quale risposta dovrei accettare :) –

+0

@DmitryFrank: Grazie per la modifica! Controllo molto importante ... –

+1

prev.getNodeValue(). Trim() è una stringa quindi prev.getNodeValue(). Trim().la lunghezza deve essere cambiata in prev.getNodeValue(). trim(). length(). Altrimenti, ottima risposta, mi ha aiutato molto. +1 –

1

In realtà un documento XML non deve seguire alcuna linea guida di stile. Pertanto non è possibile escludere i metodi di manipolazione dei documenti per mantenere un certo tipo di stile nel documento.

Ciò che raccomando è in genere la manipolazione del file in primo luogo senza alcun rispetto per il formato (basta ottenere un file xml valido quindi) e successivamente è sempre possibile eseguire un formattatore su tutto il documento per ottenere la formattazione desiderata.

+0

Sì, hai ragione. Il link di MadProgrammer ha risolto il problema per me e il tuo approccio è corretto. –

Problemi correlati