C# - XmlConvert osztály használata

forráskód letöltése
A .NET Framework osztályai maximálisan támogatják az XML állományok kezelését. Azon túl, hogy írhatjuk, vagy olvashatjuk az állományokat, lehetőségünk van az XML-be bekerülő információ helyességének ellenőrzésére, vagy szabványos formátumra alakítására, illetve a kiolvasott adatokat a szükséges típusúra konvertálhatjuk. Cikkünkben bemutatjuk, hogy az XmlConvert osztály metódusai hogyan teszik ezt lehetővé.
Az XmlConvert osztály
Az XmlConvert osztály tehát abban jelent nagy segítséget, hogy elvégezze a szükséges konverziót a futtatórendszer típusai és az XML sémadefiníciós nyelv (XSD) között. Gyakorlatban ezt úgy kell elképzelnünk, hogy az egyes csomópontok olvasásakor az osztály megfelelő metódusának (ezek a To szócskával kezdődő nevű metódusok) paraméterként át kell adni az éppen olvasott csomópont értékét, az eredmény pedig egy tetszőleges típusa lehet a CLR-nek, például double, Int32, stb.
Az osztály metódusai statikus metódusok, vizsgáljuk meg a legfontosabbakat részleteiben. Elsőként a típuskonverziót végző metódusokból választunk ki néhányat.
ToBoolean
Osztály: XmlConvert
public static bool ToBoolean(
string s
);
Az XML-csomópontból kiolvasott értéket konvertálja bool típusú értékre. Amennyiben a kiolvasott érték „1” vagy „true”, akkor értéke TRUE, „0” vagy „false” esetén FALSE.
A metódus a következőképpen használható abban az esetben, ha az XmlTestReader osztály segítségével olvassuk az állományt.
XmlTextReader r = new XmlTextReader(<állomány neve>);
...
bool b = r.ToBoolean(r.ReadInnerXml());
Paraméterek
string s
A konvertálandó karakterlánc.
Visszatérési érték
Logikai típusú érték.
ToDecimal
Osztály: XmlConvert
public static decimal ToDecimal(
string s
);
A kiolvasott karakterláncot konvertálja decimális értékké. A következőképpen használható abban az esetben, ha az XmlTestReader osztály segítségével olvassuk az állományt.
XmlTextReader r = new XmlTextReader(<állomány neve>);
...
decimal d = r.ToDecimal(r.ReadInnerXml());
Paraméterek
string s
A konvertálandó karakterlánc.
Visszatérési érték
Decimális érték.
A fentiek analógiájára használható a ToGuid metódus a kiolvasott karakterlánc GUID azonosítóvá történő konvertálására. Különböző típusú egészekre a ToInt16, a ToInt32, és a ToInt64 metódusokkal konvertálhatjuk a kiolvasott karakterláncokat.
A dátum típusú értékek visszaalakítására a ToDateTime metódus alkalmas, deklarációja a következő.
ToDateTime
Osztály: XmlConvert
public static DateTime ToDateTime(
string s,
string format
);
A metódussal a kiolvasott karakterláncot alakíthatjuk DateTime típusú értékké úgy, hogy az első paraméterben adjuk meg a kiolvasott karakterláncot, valamint a második paraméterben az értelmezést lehetővé tevő formátumspecifikációt.
A második paraméter is egy karakterlánc, mely az érték generálásakor jelzi, hogy milyen formátumban tárolódott az érték az XML csomópontban. Például „yyyy-MM-ddTHH:mm:sszzzzzz”.
Paraméterek
string s
A konvertálandó karakterlánc.
string format
A formátumjelző karakterlánc.
Visszatérési érték
DateTime típusú érték.
Amikor az XML állományt írjuk, akkor a rögzítendő típusokat a .NET CLR típusairól kell karakterlánccá konvertálni, mert a csomópontokban karakterláncokat tárolunk. Ekkor használhatjuk a ToString metódus megfelelő változatát. A deklaráció a következő abban az esetben, ha a konvertálandó érték decimál típusú.
ToString
Osztály: XmlConvert
public static string ToString(
decimal value
);
A paraméterként kapott értéket karakterlánccá konvertálja.
Paraméterek
decimal value
A konvertálandó érték.
Visszatérési érték
A kapott, most már XML-be írható karakterlánc.
Az XML állományok írásakor általában egy kulcs-érték párként adjuk meg a rögzítendő értéket. Például egy csomópont írásakor a következő sor jelenik meg az XML-ben, ha a kulcs Name és az érték John:
<Name>John</Name>
Amennyiben a kulcs érték nem felel meg a W3C kiterjesztett jelölő nyelv szabályainak, akkor az állomány olvasása bizonyos esetekben hibát okoz. Ennek elkerülésére használhatjuk az osztály VerifyName metódusát, melynek deklarációja a következő:
VerifyName
Osztály: XmlConvert
public static string VerifyName(
string name
);
Képes arra, hogy a paraméterként kapott láncot ellenőrizze, és eldöntse, hogy megfelel-e a W3C szabványnak. Amennyiben nem megfelelő, akkor egy XmlException kivétel keletkezik, és az írási művelet megszakad. Ilyen lehet, ha például a kulcs értékének a „Személy neve” értéket adjuk meg, ugyanis az nem lehet kéttagú.
Paraméterek
string name
Az ellenőrizendő karakterlánc.
Visszatérési érték
Az ellenőrzött karakterlánc.
Amennyiben a rögzítendő karakterlánc valamilyen speciális karaktert tartalmaz, nem írató be az XML állományba. Ekkor az XmlConvert osztály EncodeName metódus meghívásával a speciális karaktereket kicserélhetjük a szabványnak megfelelő karakterekre.
EncodeName
Osztály: XmlConvert
public static string EncodeName(
string name
);
Konvertálja a nem-szabványos karaktereket a megfelelő formátumba. Például ha a kiírandó karakterlánc tartalmazza a „/” karaktert, akkor azt a metódus a „_x002F_” karakter-együttesre cseréli.
Paraméterek
string name
A konvertálandó karakterlánc.
Visszatérési érték
A konvertált karakterlánc.
Amennyiben az olvasásra kerül a sor, a kódolt csomópontértékeket vissza kell alakítani, dekódolni kell. Erre szolgál a DecodeName metódus.
Gyakorlati felhasználás
A mellékelt példában a BEVITEL fül alatt írhatjuk ki a megadott értékeket a Person.xml állományba. Az íráshoz az XmlTextWriter osztály metódusait használjuk fel.
Első lépésben létrehozzuk az állományt, és a szükséges objektumot.
fs = File.Create("Person.xml");
writer = new XmlTextWriter(fs,Encoding.Default);
A formázás beállítása után beírjuk az XML dokumentum kezdő sorát, majd a <Nevek> csomópontot.
writer.WriteStartDocument();
writer.WriteStartElement("Nevek");
Nyitunk egy újabb csomópontot, majd leellenőrizzük a névérték kulcsaként megadott karakterlánc helyességét.
writer.WriteStartElement("Személy");
verified = XmlConvert.VerifyName(textBox3.Text);
Amennyiben megfelelő, beírjuk azt az állományba.
writer.WriteElementString(verified,textBox1.Text);
A kiválasztott dátumot karakterláncként tároljuk „yyyy-MM-dd” formátumban.
writer.WriteElementString("BornDate",Convert.ToDateTime(dateTimePicker1.Text).ToString("yyyy-MM-dd"));
A Web-értéket kódoljuk a megfelelő karakterláncra.
writer.WriteElementString("Web",XmlConvert.EncodeName(textBox5.Text));
Végül lezárjuk a csomópontokat.
writer.WriteEndElement();           
writer.WriteEndElement();           
writer.WriteEndDocument();
A művelet eredményeként a következő XML állomány generálódott.
<?xml version="1.0" encoding="windows-1250"?>
<Nevek>
  <Személy>
    <ID>1001</ID>
    <Név>Gipsz Jakab</Név>
    <Address>1025 Budapest E u 15.</Address>
    <BornDate>2002-08-06</BornDate>
    <Web>http:_x002F__x002F_sales.company.com_x002F_</Web>
  </Személy>
</Nevek>
Az OLVAS fül alatt a tárolt értékeket kiolvashatjuk az XmlTextReader osztály segítségével, és megjeleníthetjük a mezőkben. Elsőként példányosítjuk az osztályt.
reader = new XmlTextReader("Person.xml");
Majd elkezdjük olvasni a csomópontokat, amíg a Read metódus talál értékeket.
while (reader.Read())
{
  if (reader.Name == verified)
  {
    textBox8.Text = reader.ReadInnerXml();            
  }
A dátum értéket visszaalakítjuk DateTime objektummá.
  else if (reader.Name == "BornDate")
  {
    dateTimePicker2.Value = XmlConvert.ToDateTime(reader.ReadInnerXml());
  }
A kódolt karakterláncot dekódoljuk.
  else if (reader.Name == "Web")
  {
    textBox6.Text = XmlConvert.DecodeName(reader.ReadInnerXml());
  }
}
Az olvasás eredményeképpen a karakterláncok megjelennek a szövegmezőkben, valamint a DateTimePicker kontrolban.