读写一般格式的XML文件
【1】 当被用来描述数据库时,XML 拥有两项凌驾于专有格式(如Access .mdb 或dBase .dbf 格式)的优点:XML 是人类易读的,而且它是根据众所周知、开放式的标准所建立的。
【2】 XML描述数据本身。由于数据显示与内容分开,XML定义的数据允许指定不同的显示方式,使数据更合理地表现出来。本地的数据能够以客户配置、使用者选择或其他标准决定的方式动态地表现出来。
【3】 XML具有较好的保值性。XML的保值性来自它的先驱之一——SGML语言。SGML是一套有着十几年历史的国际标准,它最初设计的一大目标就是要为文件提供50年以上的寿命。
而且从XML文件向数据库里导入数据并不是一件难事,所以选取XML文件做为数据的承载是非常好的选择。
(XML的读取实例)
<ge name="电压表"> 图元的名称
<flagOrder>DrawLine</flagOrder>
<X>67</X>
<Y>23</Y>
<X1>37</X1>
<Y1>77</Y1>
<lw>1</lw>
<R>0</R>
<G>0</G>
<B>0</B>
<gee>
<flagOrder>DrawRectangle</flagOrder>
<X>85</X>
<Y>76</Y>
<X1>30</X1>
<Y1>36</Y1>
<lw>1</lw>
<R>0</R>
<G>0</G>
<B>0</B>
</gee>
<gee>
<flagOrder>DrawEllipse</flagOrder>
<X>30</X>
<Y>7</Y>
<X1>70</X1>
<Y1>46</Y1>
<lw>1</lw>
<R>0</R>
<G>0</G>
<B>0</B>
</gee>
</ge>
(写这个实例XML文件的代码:)
for(int i=0;i< GEList2D.Count;i++)//将某一个图元中的图素数据依次写入XML文件
{
GEObj = (CGE)GEList2D[i];
//对图元中的图素数据进行等比例缩小比例是4:1
GEObj.ptDrawStart.X = GEObj.ptDrawStart.X/4;
GEObj.ptDrawStart.Y = GEObj.ptDrawStart.Y/4;
GEObj.ptDrawEnd.X = GEObj.ptDrawEnd.X/4;
GEObj.ptDrawEnd.Y = GEObj.ptDrawEnd.Y/4;
writer.WriteStartElement("gee");
writer.WriteElementString("flagOrder",GEObj.flagOrder.ToString());
writer.WriteElementString("X",GEObj.ptDrawStart.X.ToString());
writer.WriteElementString("Y",GEObj.ptDrawStart.Y.ToString());
writer.WriteElementString("X1",GEObj.ptDrawEnd.X.ToString());
writer.WriteElementString("Y1",GEObj.ptDrawEnd.Y.ToString());
writer.WriteElementString("lw",GEObj.GElw.ToString());
writer.WriteElementString("R",GEObj.R.ToString());
writer.WriteElementString("G",GEObj.R.ToString());
writer.WriteElementString("B",GEObj.R.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
(写这个实例XML文件的代码:)
while(xtr.Read())
{
switch(xtr.NodeType)
{
case XmlNodeType.Element:
{
if(xtr.IsStartElement("ge"))
{
this.GEName[i] = xtr.GetAttribute("name").ToString();//获取图元名称
}
if(xtr.IsStartElement("gee"))//开始读取一个图素
{}
if(xtr.IsStartElement("flagOrder"))//flagOrder
{
switch(xtr.ReadElementString("flagOrder"))//根据不同的命令标志位建立不同的对象
{
case "DrawLine":
this.GEObj = new CLine();
this.GEObj.flagOrder = "DrawLine";//注意要在这里赋值
break;
case "DrawRectangle":
this.GEObj = new CRectangle();
this.GEObj.flagOrder = "DrawRectangle";
break;
case "DrawEllipse":
this.GEObj = new CEllipse();
this.GEObj.flagOrder = "DrawEllipse";
break;
case "DrawArc":
this.GEObj = new CArc();
this.GEObj.flagOrder = "DrawArc";
break;
}
////////////////////////////////////////////////////////////////////////////
}
if(xtr.IsStartElement("X"))//ptDrawStart.X
{
this.GEObj.ptDrawStart.X = Int32.Parse(xtr.ReadElementString("X").ToString());
}
if(xtr.IsStartElement("Y"))//ptDrawStart.Y
{
this.GEObj.ptDrawStart.Y = Int32.Parse(xtr.ReadElementString("Y").ToString());
}
if(xtr.IsStartElement("X1"))//ptDrawEnd.X
{
this.GEObj.ptDrawEnd.X = Int32.Parse(xtr.ReadElementString("X1").ToString());
}
if(xtr.IsStartElement("Y1"))//ptDrawEnd.Y
{
this.GEObj.ptDrawEnd.Y = Int32.Parse(xtr.ReadElementString("Y1").ToString());
}
if(xtr.IsStartElement("lw"))//lw
{
this.GEObj.GElw = Int32.Parse(xtr.ReadElementString("lw").ToString());
}
if(xtr.IsStartElement("R"))//R
{
this.GEObj.R = Int32.Parse(xtr.ReadElementString("R").ToString());
}
if(xtr.IsStartElement("G"))//G
{
this.GEObj.G = Int32.Parse(xtr.ReadElementString("G").ToString());
}
if(xtr.IsStartElement("B"))//B
{
this.GEObj.B = Int32.Parse(xtr.ReadElementString("B").ToString());
}
break;
}
case XmlNodeType.EndElement://读取该图素结束
{
if(xtr.Name.ToString().Equals("gee"))
{
this.GEList2D.Add(GEObj);//一个图素完成
}
break;
}
}
}
GEList1D.Add(GEList2D);//完成一个GEList2D,将之加入GEList1D,即读完一个图元文件
xtr.Close();//关键必须关闭,否则独占文件就写不进去
GEList2D = new ArrayList();//重新再为GEList2D分配一块区域
}











