项目描述:打造一个在线通信录,实现在线通讯录的显示、添加、删除
项目分析:
一、数据文件
需要的Xml文件(txl.xml)如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="txl.xsl"?>
<txl>
<user>
<pic>1.bmp</pic>
<name>ittalk</name>
<tel>51872033</tel>
<qqmsn>7987931</qqmsn>
<mobil>13667181380</mobil>
<work>北大青鸟</work>
<address>北大青鸟武汉赛德</address>
<email>ninesunnine@sina.com</email>
<otherMsg>无</otherMsg>
</user>
<user>
<pic>2.bmp</pic>
<name>ittalk</name>
<tel>51872033</tel>
<qqmsn>7987931</qqmsn>
<mobil>13667181380</mobil>
<work>北大青鸟</work>
<address>北大青鸟武汉赛德</address>
<email>ninesunnine@sina.com</email>
<otherMsg>无</otherMsg>
</user>
</txl>
该XML文件对应的样式表为txl.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<table align="center" width="90%" border="1">
<tbody>
<tr bgcolor="#336699">
<th>图片</th>
<th>姓名</th>
<th>电话</th>
<th>qq/Msn</th>
<th>手机</th>
<th>工作单位</th>
<th>通信地址</th>
<th>Email</th>
<th>其他信息</th>
</tr>
<xsl:apply-templates select="/txl/user"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="user">
<tr>
<td><xsl:variable name="x"><xsl:value-of select="pic"/></xsl:variable><img src="{$x}"></img></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="tel"/></td>
<td><xsl:value-of select="qqmsn"/></td>
<td><xsl:value-of select="mobil"/></td>
<td><xsl:value-of select="work"/></td>
<td><xsl:value-of select="address"/></td>
<td><xsl:value-of select="email"/></td>
<td><xsl:value-of select="otherMsg"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
二、显示Xml文件
使用xsl自动样式显示XML文件步骤:
1、 先定义一个System.IO.StringWriter对象
2、 创建一个Xml的文档对象,并家载Xml文件
3、 创建一个XslTransform对象并加载Xsl文件
4、 调用转换函数(第一个参数Xml文档对象,第二个参数null,第三个参数StringWriter对象,第四个参数null)
5、 调用Response.Writer方法显示StringWriter对象中的数据。
//先定义一个System.IO.StringWriter对象
System.IO.StringWriter sw=new StringWriter();
//创建一个Xml的文档
System.Xml.XmlDocument doc=new XmlDocument();
//装载一个Xml文档
doc.Load(Server.MapPath("txl.xml"));
//创建一个System.Xml.Xsl.XslTransform对象
System.Xml.Xsl.XslTransform xst=new XslTransform();
//装载xml文件对应的样式表txl.xsl
xst.Load(Server.MapPath("txl.xsl"));
//利用xst来转换doc的显示
xst.Transform(doc,null,sw,null);
Response.Write(sw.ToString());
三、在通信录中添加用户
相关知识:
1、 XmlDocument对象是所有DOM树的根,这个根至少有一个子节点,即根元素,该根元素使用DocumentElement表示,还可以有一个根元素,那就是DocumentType表示DTD类型。
2、 XmlDocument对象的一些属性
a) HasChildNodes
b) ChildNodes
c) ParentNode
d) InnerXml属性节点和其子节点的串联值。
e) OuterXml表示该节点和其子节点的标记
如何更新一个文件
1、 先创建一个Xml文档对象,同时加载对应的XML文件
2、 获取Xml文档对象的根结点root
3、 创建一个元素,同时给该元素初始化
4、 在对应的位置放置该元素。
5、 创建4中元素对应的子元素,同时在4中的元素的下面添加对应的元素。
6、 记住将修改完毕的XML文件存盘,这时候需要调用XmlDocument对象的Save方法。
//首先创建一个Xml文档对象,同时加载对应的XML文件
System.Xml.XmlDocument doc=new XmlDocument();
//加载txl.xml文件
doc.Load(Server.MapPath("txl.xml"));
//定位该文件的根结点
XmlNode root=doc.DocumentElement;
//在doc中创建一个元素user
XmlElement user=doc.CreateElement("user");
//将user元素添加到树根的尾部
root.AppendChild(user);
//在doc中创建一个元素name
XmlElement name2=doc.CreateElement("name");
//设置name元素的文本内容
name2.InnerText=name1.Text;
XmlElement tel1=doc.CreateElement("tel");
tel1.InnerText=tel.Text;
XmlElement qqmsn1=doc.CreateElement("qqmsn");
qqmsn1.InnerText=qqmsn.Text;
XmlElement mobil1=doc.CreateElement("mobil");
mobil1.InnerText=mobil.Text;
XmlElement work1=doc.CreateElement("work");
work1.InnerText=work.Text;
XmlElement address1=doc.CreateElement("address");
address1.InnerText=address.Text;
XmlElement email1=doc.CreateElement("email");
email1.InnerText=email.Text;
XmlElement otherMsg1=doc.CreateElement("otherMsg");
otherMsg1.InnerText=otherMsg.Text;
//将创建的user元素的子元素添加到user元素的节点内部。
user.AppendChild(name2);
user.AppendChild(tel1);
user.AppendChild(qqmsn1);
user.AppendChild(mobil1);
user.AppendChild(work1);
user.AppendChild(address1);
user.AppendChild(email1);
user.AppendChild(otherMsg1);
//将对txl.xml文件的修改存入文件
doc.Save(Server.MapPath("txl.xml"));
四、在通信录中查找一个用户
基本知识:需要读取XML的数据,并进行对照。
1、 要读取XML可以使用XmlReader类,但是该类是一个抽象类,用于读取基于文本的XML文件的XmlTextReader类,实现了XmlReader类。
2、 当必须通过DOM将文档的一部分读取到内存中的时候,应该使用XmlTextReader类。
3、 首先创建XmlTextReader类的实例,并调用Read方法来读取文件。
a) 创建实例的时候可以传递参数为Xml文件
b) 调用Read()方法逐个读取其节点直至到达文件的结尾。
//声明并创建XmlTextReader类的对象xtr
XmlTextReader xtr=new XmlTextReader(Server.MapPath("txl.xml"));
string wsx="";
bool flag=false;
string showMsg="";
string tmpNodeName="";
//利用xtr对象的Read()方法循环读取文件的节点
while(xtr.Read())
{
//当找到了那个人同时节点的类型是元素同时节点的名称是user的时候退出循环
if(flag==true && xtr.NodeType==System.Xml.XmlNodeType.Element && xtr.LocalName.Equals("user"))
break;
//当节点类型是元素的时候,记录该元素的节点名称
if(xtr.NodeType==System.Xml.XmlNodeType.Element)
tmpNodeName=xtr.LocalName.ToString();
//当没有找到指定的人时,判断xtr是不是文本类型
if(flag==false)
if( xtr.NodeType==System.Xml.XmlNodeType.Text)//如果为文本类型那么
if(xtr.Value==userName.Text)//当为文本类型同时对应的值为要查找的人的时候
{
flag=true;//设置找到了要找的人的标志
}
//如果已经找到了这个人同时xtr当前为文本类型那么
if(flag==true && xtr.NodeType==System.Xml.XmlNodeType.Text)
showMsg += " "+tmpNodeName+":"+xtr.Value;
}
//关闭xtr
xtr.Close();
//显示找到的人的详细信息
Response.Write(showMsg);
五:利用xmlPath来删除指定节点
//首先定义一个文档对象
XmlDocument doc=new XmlDocument();
doc.Load(Server.MapPath("txl.xml"));
XmlNode xn=doc.SelectSingleNode("/txl/user[name=/"" + userName.Text +"/"]");
try
{
XmlNode parentxn=xn.ParentNode;
parentxn.RemoveChild(xn);
}
catch(Exception ex)
{
Response.Write(ex.Message.ToString());
}
doc.Save(Server.MapPath("txl.xml"));
六:利用xmlPath来更新指定的节点
XmlDocument doc=new XmlDocument();
doc.Load(Server.MapPath("txl.xml"));
//利用XmlDocument的SelectNodes方法来查找指定的用户名称符合的所有user
XmlNode xn=doc.SelectSingleNode("/txl/user[name=/"" + userName.Text +"/"]");
try
{
//遍历子节点
for(int i=0;i<xn.ChildNodes.Count;i++)
{
//给对应的子节点的内容赋值
xn.ChildNodes[i].InnerText=(i).ToString();
}
doc.Save(Server.MapPath("txl.xml"));
}
catch( Exception ex)
{
Response.Write(ex.Message);
}
七、数据转换成DataSet
System.Data.DataSet ds=new DataSet();
ds.ReadXml(Server.MapPath("txl.xml"));
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
八、将DataSet的数据写入Xml
SqlConnection con=new SqlConnection("Server=.;uid=sa;pwd=;database=pubs");
SqlDataAdapter da=new SqlDataAdapter("select * from authors",con);
System.Data.DataSet ds=new DataSet();
da.Fill(ds);
//将DataSet里面的数据写入XML
ds.WriteXml(Server.MapPath("authors.xml"));
DataGrid1.DataSource=ds;
DataGrid1.DataBind();