Quantcast
Channel: SoftWare Samuraj
Viewing all articles
Browse latest Browse all 81

DOM, Java a odstranění child nodes

$
0
0
Dneska to bude jen takový krátký. Řešil jsem nějaký problém, v rámci kterého se pracovalo s DOMem, do kterého jsem potřeboval přidat nějaké nody. Jak jsem průběžně zjistil, někdy mi do metody přicházel dokument, který už ty nody někdy obsahoval (a někdy ne).

Jako čistý řešení mi přišlo dané nody (včechno to byly child elementy jednoho nodu), pokud tam jsou, odstranit a pak je přidat s potřebnými hodnotami. K tomu jsem se rozhodl vzhledem k API, jež DOM v Javě nabízí - které mi tedy moc použitelné nepřijde.

Dokument, o kterém mluvím má (zjednodušeně) takovouhle strukturu:
<root>
<child1/>
<child2/>
<child3/>
</root>
Obecně jsem čekal, že <root> element bude mít nějakou metodu, která mi vrátí kolekci child nodů. Taková metoda sice existuje - getChildNodes() - ale bohužel vrací interface NodeList:
package org.w3c.dom;

publicinterface NodeList {
public Node item(int index);

publicint getLength();
}
Nevím jak vám, ale mě kolekce s takovým rozhraním přijde dost hrozná.

A teď, proč o tom vlastně píšu. Řekl jsem si, OK, získám NodeList, projdu ho v cyklu a jednotlivé nody odstraním. Takže jsem napsal něco takového:
if (root.hasChildNodes()) {
NodeList children = root.getChildNodes();
int count = children.getLength();

for (int i = 0; i < count; i++) {
Node child = children.item(i);
root.removeChild(child);
}
}
Načež mě překvapilo, že mi to vyhazuje NullPointerException. Ono totiž, když se odstraní element z DOMu, tak se odstraní i z daného NodeListu. Divný, ale budiž. Řešením by tedy bylo
Node child = children.item(0);
ale to se mi designově nelíbilo, takže jsem skončil s tímhle kódem:
if (root.hasChildNodes()) {
int count = root.getChildNodes().getLength();

for (int i = 0; i < count; i++) {
Node child = root.getFirstChild();

root.removeChild(child);
}
}
A jak byste to řešili vy? Mě by se líbilo nějaké elegantní řešení.

Viewing all articles
Browse latest Browse all 81

Trending Articles


VIDEO: Jak postupovat a na co dát pozor při zateplování základů a soklu


Flobertka Jiří Dressler KING COBRA limitka 100ks - výkon 40J: 19 900


Rada: kombo bez zapojeného kabelu šumí


Francúzsko chyboražba


Podzemlje - epizoda 4


Chip Jiří Jakubec


Kaspersky - Problém s instalací


Rytmus Praha o2 arena: Zdarma


Billie Eilish 1.6.2025: 2 900


Dívčí horské kolo 24" - 1 400