您的位置:首页 > 编程语言 > C#

C# 下用 xml 导入导出数据

2008-07-29 23:55 337 查看
C# 下导入导出数据比在 VC++ 下容易了很多,基本数据类型 int, float 可以自动 box, unbox, 不需要像 c++ 下得考虑封装基本数据的问题。

public static bool LoadObjects(string fileName, CCollectionBase objects, string type, ref string id)
{
try {
FileStream fs = null;
XmlReader reader = CreateDecryptReader(fileName, m_SettingPassWord, ref fs);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlElement root = doc.DocumentElement;
string s = root.Name.Trim();
if (s != type) return false;
id = root.Attributes[0].Value.Trim();
InputObjects(root.ChildNodes, objects);
reader.Close();
if (fs != null) { fs.Close(); fs = null; }
}
catch { return false; }
return true;
}

protected static bool InputObjects(XmlNodeList collection, CCollectionBase objects)
{
foreach (XmlNode n in collection) {
string id = n.Attributes[0].Value.Trim();
switch (n.Name) {
case "SETs" :
if (n.ChildNodes != null) {
CCollectionBase set = (CCollectionBase) (objects[id]?? objects.Add(id, new CCollectionBase()));
InputObjects(n.ChildNodes, set);
}
break;
case "STRs" :
string[] s = new string[n.Attributes.Count -1];
for (int i=0; i<s.Length; i++)
s[i] = n.Attributes[i+1].Value.Trim();
objects.Add(id, s);
break;
case "STR" :
objects.Add(id, n.Attributes[1].Value.Trim());
break;
case "INT":
objects.Add(id, int.Parse(n.Attributes[1].Value));
break;
case "INTs":
int[] ints = new int[n.Attributes.Count - 1];
for (int i = 0; i < ints.Length; i++)
ints[i] = int.Parse(n.Attributes[i + 1].Value);
objects.Add(id, ints);
break;
case "FLOAT":
objects.Add(id, float.Parse(n.Attributes[1].Value));
break;
case "FLOATs":
float[] floats = new float[n.Attributes.Count - 1];
for (int i = 0; i < floats.Length; i++)
floats[i] = float.Parse(n.Attributes[i + 1].Value);
objects.Add(id, floats);
break;
case "BYTEs":
byte[] b = new Byte[n.Attributes[1].Value.Length/2];
for (int i=0; i<b.Length; i++)
b[i] = byte.Parse(n.Attributes[1].Value.Substring(i*2, 2), System.Globalization.NumberStyles.HexNumber);
objects.Add(id, b);
break;
default:
if (ParseObjectsFromNode != null)
return ParseObjectsFromNode(n);
return false;
}
}
return true;
}

public static bool SaveObjects(string fileName, CCollectionBase objects, string type, string id)
{
try {
FileStream fs = null;
XmlWriter writer = CreateEncryptWriter(fileName, m_SettingPassWord, ref fs);
OutputObjects(writer, type, id, objects);
writer.Flush();
writer.Close();
if (fs != null) { fs.Close(); fs = null; }
}
catch { return false; }
return true;
}

protected static void OutputObjects(XmlWriter writer, string type, string id, CCollectionBase objects)
{
writer.WriteStartElement(type);
writer.WriteAttributeString("ID", id);

for (int i = 0; i < objects.Count; i++) {
Object obj = objects[i];
if (obj is string) {
writer.WriteStartElement("STR");
writer.WriteAttributeString("ID", objects.GetKey(i));
writer.WriteAttributeString("V", (string) obj);
writer.WriteEndElement();
}
else if (obj is string[]) {
writer.WriteStartElement("STRs");
writer.WriteAttributeString("ID", objects.GetKey(i));
string[] s= (string []) obj;
for (int n=0; n<s.Length; n++) {
writer.WriteAttributeString("S"+n.ToString(), s
);
}
writer.WriteEndElement();
}
else if (obj is int) {
writer.WriteStartElement("INT");
writer.WriteAttributeString("ID", objects.GetKey(i));
writer.WriteAttributeString("V", ((int) obj).ToString());
writer.WriteEndElement();
}
else if (obj is int[])
{
writer.WriteStartElement("INTs");
writer.WriteAttributeString("ID", objects.GetKey(i));
int[] s = (int[])obj;
for (int n = 0; n < s.Length; n++)
{
writer.WriteAttributeString("I" + n.ToString(), s
.ToString());
}
writer.WriteEndElement();
}
else if (obj is float) {
writer.WriteStartElement("FLOAT");
writer.WriteAttributeString("ID", objects.GetKey(i));
writer.WriteAttributeString("V", ((float) obj).ToString("g"));
writer.WriteEndElement();
}
else if (obj is float[])
{
writer.WriteStartElement("FLOATs");
writer.WriteAttributeString("ID", objects.GetKey(i));
float[] s = (float[])obj;
for (int n = 0; n < s.Length; n++)
{
writer.WriteAttributeString("I" + n.ToString(), s
.ToString("g"));
}
writer.WriteEndElement();
}

else if (obj is byte[]) {
writer.WriteStartElement("BYTEs");
writer.WriteAttributeString("ID", objects.GetKey(i));
byte[] b= (byte[]) obj;
string s="";
for (int n=0; n<b.Length; n++) {
s += b
.ToString("X2");
}
writer.WriteAttributeString("V", s);
writer.WriteEndElement();
}
else if (obj is CCollectionBase) {
OutputObjects(writer, "SETs", objects.GetKey(i), (CCollectionBase) obj);
}
else {
if (WriteObjectsToFile != null)
WriteObjectsToFile(writer);
}
}
writer.WriteEndElement();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: