2013-01-10 13 views
5

Rozważmy następujący dokument XML:removeChild(): jak usunąć indent też?

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

A teraz usunąć wszystkie elementy i dodać jakiś nowy element. Kod:

//-- 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); 

Nowe zawartość pliku:

<items> 


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

te irytujące puste wiersze pojawiły ponieważ removeChild() usuwa dziecko, ale pozostawia tiret z usuniętego dziecka, a linia złamać zbyt. I ten indent_and_like_break jest traktowany jako treść tekstowa, która pozostaje w dokumencie.

W related question Zamieściłem Obejście:

items_parent.setTextContent(""); 

usuwa te puste linie. Ale to jest jakiś hack hack, usuwa efekt, a nie przyczynę.

Pytanie dotyczy usunięcia przyczyny: jak usunąć dziecko z zamiarem zerwania linii?

+2

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

+0

Dziękuję, to rozwiązane problem dla mnie. Możesz dodać to jako odpowiedź, a ja to zaakceptuję. Lub pytanie nie jest poprawne, więc może oznaczać go jako duplikat, a nawet usunąć, nie jestem pewien .. –

+0

Jeśli podoba ci się to, w górę głosuj na połączone pytanie – MadProgrammer

Odpowiedz

12

"wcięcie" przed elementem i "powrót karetki" (i następne wcięcie) po tym, jak są węzłami tekstowymi. Jeśli usuniesz element i pojawi się węzeł tekstowy przed lub po nim, oczywiście te węzły nie zostaną usunięte.

Wygląda na to, że chcesz usunąć element, a następnie usunąć węzeł tekstowy przed nim (pod warunkiem, że składa się on w całości z białych znaków).

przykład może wzdłuż tych linii (w Twojej pętli usuwanie elementów):

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

Jednak, prawdziwe pytanie powinno być prawdopodobnie dlaczego dokument XML ma zbędnych węzłów tekstowych spacje w nim.

+0

Dzięki, twoje rozwiązanie działa na prawdziwe usunięcie wcięcia przed elementem! Ohh, jestem zdezorientowany: dałeś mi dokładną odpowiedź na moje pytanie, ale teraz rozumiem, że to (moje) podejście wydaje się być hacky .. Moje złe. Przepraszam. Nie wiem, jaką odpowiedź powinienem przyjąć :) –

+0

@DmitryFrank: Dzięki za edycję! Bardzo ważne sprawdzenie ... –

+1

prev.getNodeValue(). Trim() jest ciągiem, tak prev.getNodeValue(). Trim().długość powinna zostać zmieniona na prev.getNodeValue(). trim(). length(). W przeciwnym razie świetna odpowiedź pomogła mi bardzo. +1 –

1

W rzeczywistości dokument XML nie musi spełniać żadnych wytycznych dotyczących stylu. Dlatego nie można pominąć metod manipulacji dokumentami, aby zachować pewien styl w swoim dokumencie.

To, co bym zalecał, to na ogół manipulowanie plikiem bez żadnego poszanowania formatu (wystarczy wtedy uzyskać prawidłowy plik xml), a następnie zawsze można uruchomić formatyzator na całym dokumencie, aby uzyskać pożądane formatowanie.

+0

Tak, masz rację. Łącze MadProgrammera rozwiązało problem dla mnie, a twoje podejście jest poprawne. –

Powiązane problemy