C# - A StringWriter osztály lehetőségei

forráskód letöltése
Cikkünkben a System.IO névtér StringWriter osztályát mutatjuk be, mely hasznos metódusokkal rendelkezik tetszőleges karakterláncokkal történő műveletvégzéshez. A cikk végére kiderül, milyen módon használható fel állományok módosítására, hogy a módosított karakteres adathalmazt új állomány létrehozásához vegyük igénybe, amellyel felépíthetünk akár egy DataTable típusú objektumot is.
A StringWriter osztály a System.IO névtér TextWriter osztályának származtatott osztálya. Arra készült, hogy segítsen a karakterláncokkal való munkában, de nem a String osztályban megtalálható lehetőségekkel. Segítségével a karakterláncokban tárolt, de nem karakterláncként felhasználandó információt dolgozhatunk fel, így képesek vagyunk a tárolt adatokat absztrakt adatszerkezetekből kiolvasni. A StringWriter osztály segítségével a legváltozatosabb műveleteket végezhetünk állományokon. Segítségül hívhatjuk ehhez a StringWriter osztály alapját képező StringBuilder osztályt. A mellékelt példában ezt mutatjuk be.
A példa ismertetése előtt referenciaként álljon itt a StringWriter osztály metódusainak és a leggyakrabban használt property-jének listája. Sorrendben kezdjük a konstruktorral, majd a property-vel és végül a metódusokkal. A bemutatásra kerülő metódusok nem tartalmazzák a teljes listát, mivel ezek csak a paraméter típusában térnek el, funkcióban nem. Konstruktorok közül lássuk azt, amelyiket egy StringBuilder objektummal kell inicializálni:
StringWriter
Osztály: StringWriter
public StringWriter(
StringBuilder sb
);
Létrehoz egy példányt a StringWrite osztályból, megkapva a StringBuilder objektumot, melybe írni fog.
Paraméterek
StringBuilder sb
A karakterlánc-manipulációkat teszi lehetővé.
A NewLine property:
NewLine
Osztály: StringWriter
public virtual string NewLine {get; set;}
Az aktuális TextWriter objektum által használt sorlezáró karakterlánc. Alapértelmezett értéke "\r\n". Minden esetben beíródik a sor végére, amikor WriteLine metódusával egy új sor kerül az adatok sorába. Szükséges, mivel a TextReader és származtatott osztályainak elemei ezt használják az új sor kezdetének felismerésére olvasáskor.
A metódusok:
Close
Osztály: StringWriter
public override void Close();
Lezárja az adott StringWriter objektumot, illetve a vele összekapcsolt adatfolyamot.
GetStringBuilder
Osztály: StringWriter
public virtual StringBuilder GetStringBuilder();
Visszaadja a StringWriter osztály alapját képező StringBuilder objektumot. A StringBuilder objektum vagy automatikusan generálódik a StringWriter objektumhoz, vagy paraméterként adódik át a megfelelő konstruktort használva létrehozásához.
Visszatérési érték
StringBuilder objektum.
Write
Osztály: StringWriter
public override void Write(
string value
);
A paraméterként kapott adatot az aktuális karakterlánchoz illeszti. A kapott paraméterek típusa változatos, a funkció viszont minden esetben azonos.
Paraméterek
string value
A karakterlánchoz fűzendő adat.
A mellékelt példa egy, az alkalmazás mappájának /resources alkönyvtárában tárolt products.xml nevű XML állományból felépít egy DataSet objkektumot, melyet forrásként átad a Form TabControl kontroljának ’A tábla adatai XML-ből’ feliratú füle alatt elhelyezett DataGrid kontrolnak. A products.xml állomány a MS SQL Server Northwind adatbázis Products táblájának egy nézetét tartalmazza, benne a tábla 10 elemével, rekordonként három oszlop adataival: ProductID, ProductName és UnitPrice.
A TabControl kontrol másik füle alatt egy szövegmezőbe a DataSet objektum adataihoz tartozó séma töltődik be. A feladatban, bemutatandó a StringWriter osztály GetStringBuilder metódusát, a ’Módosítás a sémában és az XML-ben’ feliratú gomb megnyomásával a DataSet objektumban tárolt sémát, valamint az XML állományt kiolvasva és módosítva megváltoztatjuk a DataGrid objektum oszlopainak feliratát. A művelet végén megjelenik egy üzenetpanel a szövegmező módosított sorairól.
A DataSet objektum feltöltése után tehát kiírjuk az objektum adatainak sémáját, valamint az XML forrást is egy-egy StringWriter objektumba. Mindezt a FillControls metódusban:
private void FillControls()
{
  ds.ReadXml(Application.StartupPath + "/resources/products.xml");
  grid.DataSource = ds.Tables[0].DefaultView;
  xmlWriter = new StringWriter();
  xslWriter = new StringWriter();
  ds.WriteXmlSchema(xslWriter);
  ds.WriteXml(xmlWriter);
  schemaText.Text = xslWriter.ToString();
}
Az állomány és a séma adatait egy DoXmlXsl nevű metódusban módosítjuk:
private string DoXmlXsl(StringWriter writer)
{
  StringBuilder newBuilder = new StringBuilder();
  newBuilder = writer.GetStringBuilder().Replace("ProductID","ID");  
  newBuilder = writer.GetStringBuilder().Replace("ProductName","Name");
  newBuilder = writer.GetStringBuilder().Replace("UnitPrice","Price");
  StringWriter swriter = new StringWriter(newBuilder);
  return swriter.ToString();
}
A gomb hatására egyrészt kicseréljük a szövegmező tartalmát a megújult tartalomra, és ezt betöltjük a DataSet objektumba:
private void button1_Click(object sender, System.EventArgs e)
{
  schemaText.Text = DoXmlXsl(xslWriter);
  StringReader xslReader = new StringReader(xslWriter.ToString());
  ds.ReadXmlSchema(xslReader);
Másrészt létrehozunk egy új XML állományt a megváltozott tartalommal, majd ezt is a DataSet-be töltjük:
  FileStream xmlStream = new FileStream(Application.StartupPath + "/resources/new_products.xml",FileMode.Create);
  StreamWriter xmlStreamWriter = new StreamWriter(xmlStream);
  xmlStreamWriter.Write("<?xml version=\"1.0\" ?>");
  xmlStreamWriter.Write(DoXmlXsl(xmlWriter));
  xmlStreamWriter.WriteLine("");
  xmlStreamWriter.Close();
  ds.Tables.RemoveAt(0);
  ds.ReadXml(Application.StartupPath + "/resources/new_products.xml");
  grid.DataSource = ds.Tables[0].DefaultView;
  MessageBox.Show("A következő sorok NAME attribútuma változott az XSL állományban: \n" + schemaText.Lines.GetValue(8).ToString() + "\n" + schemaText.Lines.GetValue(9).ToString() + "\n" + schemaText.Lines.GetValue(10).ToString() + "\n A fejlécek ProductID->ID, ProductName->Name és UnitPrice->Price lettek!");
...
}