|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Programujeme s XML (6.) - DOM v Javě III.V dnešním díle se podíváme na poslední část naší
aplikace, na operace měnící strukturu souboru, tedy přidávání,
mazání a přeskupování položek.
Spodní hrana hlavního okna naší jednoduché aplikace nám nabízí čtyři operace:
Přidáváme položkysynchronized public void addItem(int row) { Element node = doc.createElement("person"); for (int i=0; i<tags.length; i++) node.appendChild(doc.createElement(tags[i])); if (row+1>=rowCount){ doc.getDocumentElement().appendChild(node); } else { doc.getDocumentElement().insertBefore(node, doc.getElementsByTagName("person").item(row+1)); } this.fireTableRowsInserted(row,1); rowCount++; }
Nejprve vytvoříme nový uzel, v cyklu do něj vložíme všechny potřebné podelementy, jejichž názvy jsou v poli Mažeme položkysynchronized public void deleteItem(int row) { if (row==-1) return; doc.getDocumentElement(). removeChild(doc.getElementsByTagName("person").item(row)); rowCount=doc.getDocumentElement(). getElementsByTagName("person").getLength(); this.fireTableRowsDeleted(row,1); }
Při mazání položek pouze smažeme odpovídající element (Implementace DOM někde v podzemí rekurzivně smaže jeho obsah). Přepočítáme počet elementů (stejně dobře bychom mohli pouze dekrementovat proměnnou Měníme pořadí položeksynchronized public void moveUp(int row) { if (row<1) return; Element ref = ((Element)doc.getDocumentElement(). getElementsByTagName("person").item(row-1)); Element it = ((Element)doc.getDocumentElement(). getElementsByTagName("person").item(row)); doc.getDocumentElement().insertBefore(it,ref); } Pokud jsme na prvním řádku (tj na řádku s číslem 0) a nebo není označeno nic, je jasné, že tato akce musí selhat, a proto v případě, kdy číslo označeného řádku je menší než 1, opustíme funkci. Po této kontrole najdeme v dokumentu dva elementy, jednak referenční, před který budeme vkládat a druhak ten element, jenž chceme přesunout. V tomto případě je referenčním elementem ten, který leží nad přesouvaným elementem. synchronized public void moveDown(int row) { if (row>rowCount-2) return; Element it = ((Element)doc.getDocumentElement(). getElementsByTagName("person").item(row)); if (row==rowCount-2){ doc.getDocumentElement().appendChild(it); } else { Element ref = ((Element)doc.getDocumentElement(). getElementsByTagName("person").item(row+2)); doc.getDocumentElement().insertBefore(it,ref); } } Princip je podobný, ale tentokrát musíme ošetřit situaci, kdy kurzor stojí na předposlední položce, a proto nemůžeme použít žádný referenční element, a místo toho přidáváme na konec kořenového elementu metodou appendChild(). Pokud nestojíme na předposlední položce, pracuje metoda podobně jako předchozí, akorát jako referenční používa uzel o dvě položky dál (vkládá se před referenční uzel, kdybychom použili následující, budeme vkládat opět na stejné místo).
Funkčnost předchozích dvou metod ukazuje na to, že jeden element se v dokumentu smí vyskytovat pouze jednou a pokud ho vložíme znovu na jiné místo, dojde k přesunu. Pokud potřebujeme vložit více stejných elementů (nebo jiných uzlů) na různá místa, nebo kopírovat uzly v rámci jednoho dokumentu, s výhodou použijeme metodu cloneNode(). Pokud potřebujeme kopírovat uzly mezi různými dokumenty, zavádí DOM Level 2 metodu importNode() třídy Zde bych prozatím DOM opustil a příště se rychle podíváme na (údajně jednodušší, ale rozhodně rychlejší) rozhraní Simple API for XML neboli SAX.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |