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:
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:
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>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:
<child1/>
<child2/>
<child3/>
</root>
package org.w3c.dom;Nevím jak vám, ale mě kolekce s takovým rozhraním přijde dost hrozná.
publicinterface NodeList {
public Node item(int index);
publicint getLength();
}
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()) {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
NodeList children = root.getChildNodes();
int count = children.getLength();
for (int i = 0; i < count; i++) {
Node child = children.item(i);
root.removeChild(child);
}
}
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()) {A jak byste to řešili vy? Mě by se líbilo nějaké elegantní řešení.
int count = root.getChildNodes().getLength();
for (int i = 0; i < count; i++) {
Node child = root.getFirstChild();
root.removeChild(child);
}
}