Vedlikehold av en XML-fil
Personer
La oss først se på klassen Personer:
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
namespace maintainXML
{
[XmlRoot("personer")] public class Personer
{
private ArrayList personList;
public Personer()
{
personList = new ArrayList();
}
[XmlElement("person")] public onePerson[] Items
{
get
{
onePerson[] Items = new onePerson[personList.Count];
personList.CopyTo(Items);
return Items;
}
set
{
if (value == null)
return;
onePerson[] Items = (onePerson[])value;
personList.Clear();
foreach (onePerson Item in Items)
personList.Add(Item);
}
}
public int AddPerson(onePerson Item)
{
return personList.Add(Item);
}
public class onePerson
{
[XmlAttribute("navn")] public string name;
[XmlAttribute("adresse")] public string address;
public onePerson(){ }
public onePerson(string Name, string Address)
{
name = Name;
address = Address;
}
public override string ToString()
{
return name;
}
}
}
}
Merk den spesielle syntaksen som brukes som merkelapper på noen klasser og attributter:
- [XmlRoot("personer")] public class Personer
- [XmlElement("person")] public onePerson[] Items
- [XmlAttribute("navn")] public string name;
- [XmlAttribute("adresse")] public string address;
Når vi identerer slik som over, ser vi at angivelsene knytter de respektive programelementene til den XML-strukturen vi har sagt vi skal anvende.
Lesing av en fil og opprettelse av en liste, Alle, med personer, kan se slik ut:
XmlSerializer s = new XmlSerializer(typeof(Personer));
System.IO.TextReader r = new System.IO.StreamReader(filename);
Alle=(Personer)s.Deserialize(r);
r.Close();
Serialisering av en liste med personer, Alle, kan se slik ut:
XmlSerializer s = new XmlSerializer(typeof(Personer));
System.IO.TextWriter w = new System.IO.StreamWriter(filename);
s.Serialize(w,Alle);
w.Close();
Begge kodefragmentene inngår i Form nedenfor.
Form
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;
namespace maintainXML
{
public partial class Form1 : Form
{
// the personlist
Personer Alle;
string filename;
public Form1()
{
InitializeComponent();
// Get data
filename = Path.Combine(Application.StartupPath,
"data.xml");
if (System.IO.File.Exists(filename))
{
// get the data
XmlSerializer s = new XmlSerializer(typeof(Personer));
System.IO.TextReader r = new System.IO.StreamReader(filename);
Alle=(Personer)s.Deserialize(r);
r.Close();
}
else
{
// produce a dummyperson to start with
Alle = new Personer();
Alle.AddPerson(new Personer.onePerson("Ole Brumm",
"100meterskogen"));
}
// Fill up the listBoks
listBox1.Items.AddRange(Alle.Items);
// and mark first as selected
if (listBox1.Items.Count > 0)
{
listBox1.SetSelected(0, true);
ShowItem(0);
}
// disable the update button
buttonUpdate.Enabled=false;
}
private void ShowItem(int ix)
{
// fill the textboxes
if (ix == -1)
{
textBoxName.Text = "";
textBoxAddress.Text = "";
}
else
{
textBoxName.Text =
((Personer.onePerson)listBox1.Items[ix]).name;
textBoxAddress.Text =
((Personer.onePerson)listBox1.Items[ix]).address;
}
buttonUpdate.Enabled = false;
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ShowItem(listBox1.SelectedIndex);
}
private void buttonRemove_MouseClick(object sender, MouseEventArgs e)
{
// Remove the selected person and select next if possible
int ix = listBox1.SelectedIndex;
listBox1.Items.RemoveAt(ix);
if (listBox1.Items.Count == 0)
ShowItem(-1);
else
{
if (listBox1.Items.Count <= ix)
ix = 0;
listBox1.SetSelected(ix, true);
ShowItem(ix);
}
listBox1.Refresh();
}
private void buttonNew_MouseClick(object sender, MouseEventArgs e)
{
// Add a new person, use a dialogbox
NewDialog d = new NewDialog();
DialogResult dr=d.ShowDialog(this);
if (dr==DialogResult.OK)
{
Alle.AddPerson(new Personer.onePerson(d.theName,d.theAddress));
listBox1.Items.Clear();
listBox1.Items.AddRange(Alle.Items);
listBox1.SetSelected(listBox1.Items.Count - 1, true);
ShowItem(listBox1.Items.Count - 1);
}
d.Hide();
d.Dispose();
}
private void buttonUpdate_MouseClick(object sender, MouseEventArgs e)
{
// Update data for the selected person
int ix = listBox1.SelectedIndex;
((Personer.onePerson)listBox1.Items[ix]).name =
textBoxName.Text;
((Personer.onePerson)listBox1.Items[ix]).address =
textBoxAddress.Text;
listBox1.Items.Clear();
listBox1.Items.AddRange(Alle.Items);
buttonUpdate.Enabled = false;
}
private void textBoxName_TextChanged(object sender, EventArgs e)
{
// Name is changed
buttonUpdate.Enabled = textBoxName.Text.Length>0;
}
private void textBoxAddress_TextChanged(object sender, EventArgs e)
{
// Address is changed
buttonUpdate.Enabled = true;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
// Whatever is in the listbox is moved to Alle:
Personer.onePerson[] ps=
new Personer.onePerson[listBox1.Items.Count];
new System.Collections.ArrayList(listBox1.Items).CopyTo(ps);
Alle.Items=ps;
// Serialize it
XmlSerializer s = new XmlSerializer(typeof(Personer));
System.IO.TextWriter w = new System.IO.StreamWriter(filename);
s.Serialize(w,Alle);
w.Close();
this.Dispose(true);
}
}
}
NewDialog
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace maintainXML
{
public partial class NewDialog : Form
{
public NewDialog()
{
InitializeComponent();
buttonOK.Enabled=false;
}
public string theName
{
get { return textBoxName.Text; }
}
public string theAddress
{
get { return textBoxAddress.Text; }
}
private void textBoxName_TextChanged(object sender, EventArgs e)
{
buttonOK.Enabled =
(textBoxName.Text.Length > 0) &&
(textBoxAddress.Text.Length > 0);
}
private void textBoxAddress_TextChanged(object sender, EventArgs e)
{
buttonOK.Enabled = (
textBoxName.Text.Length > 0) &&
(textBoxAddress.Text.Length > 0);
}
}
}
Datafil
Datafila som lagres, data.xml, kan se slik ut:
<?xml version="1.0" encoding="utf-8"?> <personer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <person navn="Ole" adresse="Halden" /> <person navn="Ole-Johan" adresse="Halden" /> <person navn="Hans Kristian" adresse="Moss" /> <person navn="Marit" adresse="Drammen" /> <person navn="Johanne" adresse="Moss" /> <person navn="Jacob Olav" adresse="Her og der" /> <person navn="Peder Clausen" adresse="Bodø" /> <person navn="Per" adresse="Aremark" /> <person navn="Pedersen" adresse="kinsarvik" /> <person navn="jakobsen" adresse="tokyo" /> </personer>





