V předchozím článku jsem se věnoval popisu metod čtení dat z XML souborů. Tentokrát si ukážeme, jak se data do XML v ASP.NET ukládají a jak se mění. K praktické demonstraci opět využijeme jazyk C#.

Třída XmlWriter

V předchozím článku jsme se zabývali třídou XmlReader, která slouží ke čtení dat ze souboru XML. Třída XmlWriter je naopak rychlý proudový zapisovač dat ve formátu XML. Použití třídy XmlWriter je velice snadné a intuitivní. V praxi je potřeba ztát jen několik metod, které celý dokument vymodelují. Podívejte se na následující výpis:

XmlTextWriter writer = new XmlTextWriter(Sever.MapPath(„doc.xml“));
writer.Formatting = Indented;
writer.Indentation = 2;
writer.WriteStartDocument();
 writer.WriteElementString(„jmeno“, „Interval“);
    //<jmeno>Interval</jmeno>
 writer.WriteComment(„generovano pomoci XmlTextWriter“);
    //<!—generovano pomoci XmlTextWriter –>
  writer.WriteStartElement(„jmeno“);
    //<jmeno>
  writer.WriteEndElement();
    //uzavira aktualni otevreny uzel
writer.WriteEndDocument();
writer.Flush(); //ulozeni
writer.Close();

Vypsaný kód nepotřebuje příliš mnoho vysvětlování. Na prvním řádku jsme vytvořili novou instanci třídy XmlTextWriter nazvanou příznačně writer. Zapisovat budeme do souboru doc.xml. Vcelku nic zajímavého, zajímavé jsou až následující dva řádky:

writer.Formatting = Indented;
writer.Indentation = 2;

Tyto řádky totiž udávají, jak bude výstup strukturován. První říká, že každá úroveň bude odsazena (výchozí hodnota je writer.Formatting = None), druhý se postará o konkrétní vzdálenost odsazení. Ve výsledku bude každá úroveň odsazena o dva znaky. To je velmi výhodné, pokud bychom totiž generovali XML dokument jenom vytvářením nějaké instance String s použitím značek XML jako v následujícím výpisu, museli bychom se starat o odsazení sami. Následující způsob je velmi neefektivní a navíc až bolestně náchylný k chybám:

string xmlOut = „“;
xmlOut += „<jmeno>“;
xmlOut += “ <prijmeni>Interval</prijmeni>“;
xmlOut += „</jmeno>“;

Zápis dat pomocí XmlDocument

Dalším způsobem, jak měnit dokumenty XML, je použití typu XmlDocument.Už minule jsme si řekli, co je XmlDocument a jak s XML vstupem pracuje. Bylo vidět, že tato třída nabízí mnohem širší možnosti pro práci s dokumenty XML. Samozřejmě, vždy záleží na konkrétní situaci, ale musím se přiznat, že pro zápis i pro čtení v drtivé většině případů používám právě tuto třídu.

Dále v textu si ukážeme, jak budeme pomocí třídy XmlDocument měnit načtené soubory a přidávat nové uzly. Stejně jako při čtení dokumentů musíme ale nejdříve popsat způsob chápání dokumentu XML z pohledu DOM. Podívejme se na nejčastěji používané metody pro změnu dokumentu XML:

  • AppendChild(XmlNode child) – přidá uzel (XmlNode) na konec seznamu potomků aktuálního uzlu.

    XmlDocument doc = new XmlDocument();
    XmlNode currNode = doc.DocumentElement;
    XmlElement newElem=doc.CreateElement(„jmeno“);
    newElem.InnerText=“Interval“;
    currNode.FirstChild.AppendChild(newElem);

  • CreateAttribute(string prefix, string name, string namespace) – přetížená metoda, která akceptuje až tři parametry, přičemž parametr name je základní. Vytvoří atribut XmlAttribute se zadaným názvem. Další parametry představují jmenné prostory (viz dokumentace .NET SDK).
  • CreateElement(string prefix, string name, string namespace) – taktéž přetížená metoda. Vytváří XmlElement se zadaným názvem. Další parametry opět představují jmenné prostory.
  • CreateNode(XmlNodeType type, string name, string namespace) – vytváří XmlNode zadaného typu, názvu a jmenného prostoru.

    CreateNode(XmlNodeType.Element, „jmeno“, „“);

  • CreateXmlDeclaration(string version, string encoding, string standalone) – vytvoří deklaraci dokumentu.
  • RemoveAll() – odstraní všechny potomky i atributy aktuálního uzlu.
  • RemoveChild(XmlNode child) – odstraní zadaného potomka.
  • ReplaceChild(XmlNode newchild, XmlNode oldchild) – nahradí druhý uzel prvním.

    XmlNode root = doc.DocumentElement;
    XmlElement elem = doc.CreateElement(„jmeno“);
    elem.InnerText=“Interval“;
    root.ReplaceChild(elem, root.FirstChild);

  • Provedené změny se do souboru zapisují metodou Save(string file), tedy například xDoc.Save("doc.xml");.

    Využití v praxi

    Výčet a stručný popis nejdůležitějších technik máme za sebou, je čas ukázat si nějaký komplexnější příklad, který nám všechno hezky propojí a předvede. Podívejme se třeba na jednoduchou metodu, která změní hodnotu nějakého uzlu:

    public class Settings {
      public XmlDocument Change(XmlDocument xDoc, string node, string newValue) {
        XmlNode root = xDoc.DocumentElement;
        XmlElement newNode = xDoc.CreateElement(node);
        newNode.InnerText= newValue;
        XmlNode xNode = xDoc.DocumentElement.SelectSingleNode(„descendant::“ + node);
        string stri = xNode.Name;
        root.ReplaceChild(newNode, xNode);
        return xDoc;
      }
    }
    // priklad pouziti nasi tridy a metody
    Settings s = new Settings();
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(Server.MapPath(„database/settings.xml“));
    xDoc = s.Change(xDoc, „jmeno“, „Interval“);

    V tomto příkladu není nic, co byste po přečtení článku neměli pochopit. Je to opravdu velmi jednoduchá metoda, použitá výhradně k demonstraci způsobu změny dokumentu. Pracuje správně za předpokladu, že uzel <jmeno> se v dokumentu vyskytne pouze jednou. Pokud by dokument obsahoval více takových uzlů, metoda by změnila vždy první nalezený. Pro konkrétnější specifikaci by bylo potřeba změnit parametr u metody SelectSingleNode.

    Odkazy a zdroje

    Starší komentáře ke článku

    Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět