C# - XML dokumentum létrehozása programból

XML 6. rész

forráskód letöltése
XML-el foglalkozó cikkeink aktuális részében most az xml dokumentum programból történő létrehozásán fáradozunk.
XML dokumentumhoz elengedhetetlen egy XmlDocument osztály, így mint mindig most is ennek létrehozásával kezdjük és tesszük ezt úgy, hogy rendelkezésünkre álljon egy globális változó XmlDocument típusban.
private XmlDocument xd;
...
xd = new XmlDocument();      
Első lépésként hozzuk létre a dokumentum keretét és az első csomópontot. Új elemet az AppendChild függvénnyel adhatunk a dokumentumhoz. Ez a függvény egy XmlNode típusú, vagy ebből származó objektumot vár paraméterként. A CreateDocumentType ennek megfelel, hiszen az általa XmlDocumentType típus, melyet visszaad az XmlNode osztályból származik.
    private void button1_Click(object sender, System.EventArgs e)
    {
      xd.AppendChild(xd.CreateDocumentType("DocumentName", null, null, null));
Létrehozunk az első csomópontot is First névvel. Ehhez a CreateElement függvényét használhatjuk az XmlDocument osztálynak.
      xd.AppendChild(xd.CreateElement("First"));      
Fentiek elvégzése után mentjük a dokumentumot egy állományba is a Save függvény hívásával, majd az UpdateMemo belső függvényünket hívjuk, hogy a Form-on lévő TextBox tartalma frissüljön és látható legyen benne az XML dokumentumunk aktuális tartalma.
      xd.Save("_test.xml");
      UpdateMemo();
    }
Fenti sorok hatására az XML dokumentumunkba az alábbi két sor kerül:
<!DOCTYPE DocumentName>
<First />
Nézzük most mi is történik az UpdateMemo-ban. Egy StreamReader osztályt felhasználva egyszerűen beolvassuk az imént mentett xml állományt és ennek teljes tartalmát a TextBox komponens Text property-ébe írjuk, majd zárjuk a stream-et.
    private void UpdateMemo()
    {
      StreamReader sr = new StreamReader("_test.xml");
      textBox1.Text = sr.ReadToEnd();
      sr.Close();
    }
A következő nyomógomb hatására egy megjegyzést szúrunk be az XML dokumentumunkba. Megjegyzést rögtön az első csomópontunk elé szeretnénk helyezni, ezért az AppendChild most nem lenne célszerű, viszont az InsertBefore függvénnyel több sikerrel járhatunk. Ez két paramétert vár: az első a beszúrandó csomópont XmlNode típusban, a második pedig az az XmlNode, mely elé szeretnénk beszúrni az újat. A megjegyzéshez nyilván egy új csomópontot kell létrehozni, melyhez az XmlDocument osztály CreateComment függvénye segít. Ennek paraméterként a megjegyzésünk szövegét kell átadnunk.
      xd.InsertBefore(xd.CreateComment("megjegyzés"), xd.DocumentElement);
A megjegyzés beszúrása után az alábbiak szerint néz ki a dokumentum:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First />
Minden csomópontnak lehet tetszőleges számú attribútuma. Most nézzük azt, hogy First nevű, már létező csomóponthoz miként adhatunk hozzá attribútumot. Ehhez szükségünk lesz egy XmlAttribute osztályra, melyet az XmlDocument osztály CreateAttribute függvényével létre is hozhatunk. Ennek paraméterként az attribútum nevét kell megadnunk.
      XmlAttribute attr = xd.CreateAttribute("Attribute");
Az attribútum értékét az XmlAttribute osztály Value property-én keresztül adhatjuk meg.
      attr.Value = "Value";          
Az attribútum most már adott, csak hozzá kell rendelnünk a kívánt csomóponthoz. Ehhez az XmlElement osztály SetAttributeNode függvényére van szükségünk. Ehhez az osztályhoz az XmlDocument osztály DocumentElement property-én keresztül juthatunk. A SetAttributeNode függvénynek paraméterként az imént létrehozott XmlAttribute példányát kell átadnunk.
      xd.DocumentElement.SetAttributeNode(attr);
Az attribútum hozzáadása után dokumentumunk a következőképpen alakul:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First Attribute="Value" />
Bonyolítsuk tovább dokumentumunkat és a First elemhez hozzunk létre egy gyermekcsomópontot. Ehhez hozzunk létre egy XmlNode objektumot, melyhez szintén az XmlDocument osztály egyik függvényét használjuk, a CreateNode függvényt. Ennek első paraméterében a létrehozandó elem típusát határozhatjuk meg, míg a másodikba annak nevét.
      XmlNode newElem=xd.CreateNode("element", "Child1", "");  
A csomópont által meghatározott szöveget az InnerText property-n keresztül kezelhetjük.
      newElem.InnerText = "Child 1 Value";
Végül az AppendChild-el beszúrhatjuk az új elemet a First csomóponthoz.
      xd.DocumentElement.AppendChild(newElem);
XML dokumentumunk ezek után így fog kinézni:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First Attribute="Value">
  <Child1>Child 1 Value</Child1>
</First>
Következő feladatunk hasonló lesz, viszont a kivitelezés teljesen más. Most szintén a First elemhez hozunk létre egy új gyermek csomópontot Child2 névvel. Ezt viszont most a CreateElement és CreateTextNode függvényekkel érjük el. A CreateElement függvénnyel létrehozunk egy új elemet, ez lesz a Child2. A CreateTextNode függvénnyel pedig egy XmlText objektumot alkotunk, mely az új elem szövegét tárolja.
      XmlElement xe = xd.CreateElement("Child2");
      XmlText xt = xd. ("Chlid 2 Value");
Első lépésként hozzáadjuk a First-höz a Child2-öt.
      xd.DocumentElement.AppendChild(xe);
Majd azt mondjuk, hogy First elem utolsó gyermek eleme, ami most a Child2, ahhoz szintén egy AppendChild függvény hívással hozzáadjuk a belső szöveget, amit az XmlElement objektumunk tárol.
      xd.DocumentElement.LastChild.AppendChild(xt);
XML dokumentumunk ezek után így fog kinézni:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First Attribute="Value">
  <Child1>Child 1 Value</Child1>
  <Child2>Chlid 2 Value</Child2>
</First>
Következő lépésként Child1 gyermek objektumhoz adunk hozzá egy újabb gyermek objektumot SubChild1 névvel. Itt új függvényt nem használunk, a módszer ugyan az, mint amikor a Child1-et hoztuk létre.
      XmlNode xn=xd.CreateNode("element", "SubChild1", "");  
      xn.InnerText = "Sub Child 1 Value";
Eltérés csupán a hozzáadásnál van, mivel itt a First elem első (FirstChild property) gyermek eleméhez történik meg a hozzáadás.
      xd.DocumentElement.FirstChild.AppendChild(xn);
XML dokumentumunk ezek után így fog kinézni:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First Attribute="Value">
  <Child1>Child 1 Value<SubChild1>Sub Child 1 Value</SubChild1></Child1>
  <Child2>Chlid 2 Value</Child2>
</First>
Végezetük már csak szépítgetjük az XML dokumentumunkat, amit úgy teszünk, hogy a SubChild1 elem kerüljön új sorba és legyen a Child1 alá betolva. Ehhez két beszúrást kell elvégeznünk a dokumentumba, létrehozva két whitespace objektumot, az XmlDocument osztályt CreateWhitespace függvényével.
      xd.DocumentElement.FirstChild.InsertAfter(xd.CreateWhitespace("\r\n    "), xd.DocumentElement.FirstChild.FirstChild);
      xd.DocumentElement.FirstChild.InsertAfter(xd.CreateWhitespace("\r\n  "), xd.DocumentElement.FirstChild.LastChild);
XML dokumentumunk ezek után így fog kinézni:
<!DOCTYPE DocumentName>
<!--megjegyzés-->
<First Attribute="Value">
  <Child1>Child 1 Value
    <SubChild1>Sub Child 1 Value</SubChild1>
  </Child1>
  <Child2>Chlid 2 Value</Child2>
</First>

XML felhasználása C#-ban cikksorozat