C# - Csomópontműveletek XML adatstruktúrákon

XML szolgáltatások kliens-oldali Script-ekben 2. rész

forráskód letöltése
A sorozat első részében megismerhettük, hogy milyen műveletek szükségesek ahhoz, hogy a kliens-oldali Script-ekből alapvető olvasási műveleteket hajtsunk végre a megadott XML állományon. A sorozat e számában az MSXML komponens csomópontjaihoz kapcsolódó műveletekből mutatunk be néhányat. A cikkben megismerhetjük, hogy miként törölhetünk egy adott csomópontot az XML adatfolyamból, valamint hogy milyen módon fűzhetünk új csomópontokat az eredetiek mellé.
A mellékelt példa megnyitása előtt szükséges egy DOMDocument02 nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát, és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A mellékelt példa két weblapot tartalmaz. A Webform1.aspx lapon megismerhetjük annak módját, hogy miként tudunk a beolvasott XML adatfolyamba új csomópontokat bevinni. A WebForm2.apx lapon a csomópontok törlését vizsgáljuk.
Csomópontok hozzáadása
A lap betöltődésekor a TextBox1 nevű TextArea kontrolba beolvassuk az állomány teljes tartalmát. Ehhez a sorozat múlt heti számában megismert módszert használjuk. Elsőként létrehozunk egy dokumentumot, LOAD metódusával betöltjük az XML állományt, majd a dokumentum XML property-jének tartalmát a szövegmezőbe írjuk.
var xmldoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
xmldoc.load("products.xml");
document.all.TextBox1.innerText = xmldoc.xml;
Az XML szerkezete a következő:
<?xml version="1.0" ?>
<NewDataSet>
  <Products>
    <ProductID>1</ProductID>
    <ProductName>Chai</ProductName>
    <UnitPrice>18</UnitPrice>
  </Products>
  ...
</NewDataSet>
Az AddNode metódust használjuk arra, hogy új Products tagokat hozzunk létre adatokkal, majd azt a gyökércsomóponthoz fűzzük. A weblapon csak az új termék nevét és az ár értékét kell megadni, a <ProductID></ProductID> tagok értékeit automatikusan hozzuk létre.
Ezt úgy tesszük, hogy lekérdezzük a gyökércsomópontot, majd annak utolsó gyermekcsomópontjának azonosító-számértékét növeljük eggyel.
var root = xmldoc.documentElement;
var id = root.childNodes.item(root.childNodes.length-1).childNodes.item(0).text;
var num = new Number(id);
num = num + 1;
Ezt követően létre kell hoznunk egy Product csomópontot, majd a gyökérre fűznünk. Ennek módja a következő:
var newProduct = xmldoc.createNode(1, "Product", ""); root.appendChild(newProduct);
Látható, hogy a createNode metódus alkalmas a csomópont létrehozásra. Ezt követően létre kell hozni a most megalkotott csomópont gyermekeit. A ProductID csomópont létrehozása így fest:
var newID = xmldoc.createNode(1, "ProductID", "");
Meg kell adni a fent létrehozott ID-t.
newID.text = num;
Majd a csomópontot a szülőhöz kell adni.
root.childNodes.item(root.childNodes.length-1).appendChild(newID);
A többi csomópont létrehozása ezzel analóg módon zajlik, csupán a szövegmezőkben megadott értékek kerülnek az adott csomópont TEXT property-jébe.
var newName = xmldoc.createNode(1, "ProductName", "");
newName.text = document.all.TextBox2.value;
root.childNodes.item(root.childNodes.length-1).appendChild(newName);
A művelet végén újra betöltjük az xmldoc objektum tartalmát a szövegmezőbe.
Csomópontok törlése
A WebForm2.aspx lapon a betöltött XML tartalmát lehet csomópontonként törölni. A lap betöltődésekor itt is bekerül az XML adathalmaza a szövegmezőbe, valamint az összes elem azonosítója egy SELECT kontrolba. Ehhez csak a gyökérelem gyermekeire van szükségünk, és egy ciklusra, mely kiolvassa az értékeket és elhelyezi azt a SELECT egy új OPTION objektumában.
root = xmldoc.documentElement;
for (var i=0;i<root.childNodes.length;i++)
{
  o = document.createElement("OPTION");
  o.text = root.childNodes.item(i).childNodes.item(0).text;
  document.all.ComboBox1.options.add(o);
}
document.all.ComboBox1.selectedIndex = 0;
A törlést a DeleteNode függvénnyel végezzük. A gyökérelem gyerekein végighaladva megvizsgáljuk, hogy melyik elem azonosítója egyezik meg a kiválasztott azonosítóval, és azt eltávolítjuk a szerkezetből.
for (var i=0;i<root.childNodes.length;i++)
{
  if (root.childNodes.item(i).childNodes.item(0).text == document.all.ComboBox1.options.item(document.all.ComboBox1.selectedIndex).innerText)
  {
    var node = root.childNodes.item(i);
    root.removeChild(node);
A törlést a gyökérelemre meghívott removeChild metódussal végezzük el, átadva neki a törlendő csomópont indexét paraméterként. A remove metódussal töröljük az adott indexű listaelemet is.
    document.all.ComboBox1.options.remove(i);
  }
}
Majd újra betöltjük a maradék elemeket a szövegmezőbe.
document.all.TextBox1.innerText = xmldoc.xml;
A művelet végén – mikor már nincs elem a szerkezetben – elérhetővé tesszük az ÚJRATÖLTÉS gombot, mellyel újra betölthetjük az elemeket.

XML szolgáltatások kliens-oldali Script-ekben cikksorozat

XML állományok olvasása Script-ből - XML szolgáltatások kliens-oldali Script-ekben 1. rész

Csomópontműveletek XML adatstruktúrákon - XML szolgáltatások kliens-oldali Script-ekben 2. rész