在XML基础与应用提到XML的一个很重要的应用之一就是作为数据载体,应用于数据库对数据进行存储。下面我们一起来讨论XML作为数据载体的优势和具体如何实现。
XML作为数据载体的优势:
1、良好的通用性和可读性:
XML类似于HTML的语言,它没有预先定义的标签,使用DTD(document typedefinition)文档类型定义来组织数据。因此使得其格式统一,通用性良好。并且在XML文档中,可以使用特定的标记为数据定义相关的语义,可读性大大提高,早已成为业界公认的标准。
2、轻松的跨平台应用
XML文档是基于文本的,所以很容易被人和机器阅读,也非常容易使用,便于不同设备和不同系统间的信息交换。
3、清晰的层次结构:
由于XML本身的树形结构特点,它所承载的数据格式能够清晰表达数据的层次特征,因此XML便于对层次化的数据进行操作。
4、数据内容与形式的分离
在XML文档中,数据的显示样式已从文档内容中分离出来,放入相关的样式表文件中。这样一来如果要改动数据的表现形式,就不需要改动数据本身,而只要改动控制数据显示的样式表文件即可。
5、适合面向对象的程序开发
XML文档数据的逻辑结构是一种树形的层次结构,文档中的每一个元素都可以视为一个对象,同时也可以有相应的属性和方法,因而非常适合于使用面向对象的程序设计方式来开发处理这些XML文档的应用程序。
XML作为数据载体的增删改实例:
接下来,笔者利用一个以XML为数据载体的增删改查demo来简单说明XML与数据之间的交互(由于空间有限,只展示主要代码)。
1、首先在vs中新建ASP.NET项目,在项目中新建一个xml文本文件用于存储数据,编写代码如下:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE DocumentElement[ <!ELEMENT DocumentElement ANY> <!ELEMENT basic (ID,NAME)> <!ELEMENT bas-ic (ID,ADDRESS)> <!ELEMENT basic (ID,CALL)> <!ELEMENT basic (ID,JOP)> <!ELEMENT basic (ID,JOPP)> <!ELEMENT ID (#PCDATA)> <!ELEMENT NAME (#PCDATA)> <!ELEMENT ADDRESS (#PCDATA)> <!ELEMENT CALL (#PCDATA)> <!ELEMENT JOP (#PCDATA)> <!ELEMENT JOPP (#PCDATA)> ]> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <DocumentElement> <basic> <ID>1</ID> <NAME>钟艾伶</NAME> <ADDRESS>北京</ADDRESS> <CALL>1888888883</CALL> <JOP>医生</JOP> <JOPP>护士</JOPP> </basic> <basic> <ID>2</ID> <NAME>包子</NAME> <ADDRESS>北京</ADDRESS> <CALL>1888888888</CALL> <JOP>医生</JOP> <JOPP>护士</JOPP> </basic> <basic> <ID>3</ID> <NAME>小李子</NAME> <ADDRESS>北京</ADDRESS> <CALL>1878888888</CALL> <JOP>医生</JOP> <JOPP>护士</JOPP> </basic> <basic> <ID>4</ID> <NAME>王大绩</NAME> <ADDRESS>四川</ADDRESS> <CALL>1876888888</CALL> <JOP>医生</JOP> <JOPP>护士</JOPP> </basic> </DocumentElement>
2、新建xslt文件,作为xml文件内容的风格表单,编写代码如下:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:template match ="DocumentElement"> <html> <body> <table> <tr> <th>ID</th> <th>NAME</th> <th>ADRESS</th> <th>CALL</th> <th>JOP</th> <th>JOPP</th> </tr> <xsl:for-each select ="basic"> <tr> <td> <xsl:value-of select="ID"/> </td> <td> <xsl:value-of select="NAME"/> </td> <td> <xsl:value-of select="ADRESS"/> </td> <td> <xsl:value-of select="CALL"/> </td> <td> <xsl:value-of select="JOP"/> </td> <td> <xsl:value-of select="JOPP"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
3、新建一个web窗体,添加Gridview绑定显示xml存放的数据,显示效果见图1。
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile ="~/basic.xml"></asp:XmlDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" DataSourceID ="XmlDataSource1" AutoGenerateSelectButton="true" > <Columns> <asp:TemplateField HeaderText="编号"> <ItemTemplate> <%#XPath("ID")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="姓名"> <ItemTemplate> <%#XPath("NAME")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="地址"> <ItemTemplate> <%#XPath("ADDRESS")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="电话"> <ItemTemplate> <%#XPath("CALL")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="职业"> <ItemTemplate> <%#XPath("JOP")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="职称"> <ItemTemplate> <%#XPath("JOPP")%> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
图1:
public partial class Default : System.Web.UI.Page { XmlDocument xdoc; protected void Page_Load(object sender,EventArgs e) { if (!IsPostBack) { FillXdoc(); } else { xdoc = Session["doc"] as XmlDocument; } } /// <summary> /// 刷新XML中的数据 /// </summary> private void FillXdoc() { xdoc = new XmlDocument(); xdoc.Load(Server.MapPath("basic.xml")); XmlNodeList list = xdoc.GetElementsByTagName("NAME"); foreach (XmlNode node in list) { this.DropDownList1.Items.Add(node.InnerText); Session["doc"] = xdoc; } } //查询,根据姓名查询相关信息,显示在textBox中 protected void Button1_Click1(object sender,EventArgs e) { XmlNode node = xdoc.DocumentElement.SelectSingleNode("basic[NAME='" + this.DropDownList1.Text + "']"); foreach (XmlNode no in node.ChildNodes) { //1编号 2地址 3电话 4职业 5职称 if (no.LocalName == "ID") this.TextBox1.Text = no.InnerText; if (no.LocalName == "ADDRESS") this.TextBox2.Text = no.InnerText; if (no.LocalName == "CALL") this.TextBox3.Text = no.InnerText; if (no.LocalName == "JOP") this.TextBox4.Text = no.InnerText; if (no.LocalName == "JOPP") this.TextBox5.Text = no.InnerText; } } //AppendChild 添加节点 protected void Button2_Click(object sender,EventArgs e) { XmlNode node = xdoc.SelectSingleNode("DocumentElement"); XmlElement xe = xdoc.CreateElement("basic"); XmlElement xe1 = xdoc.CreateElement("ID"); xe1.InnerText = TextBox1.Text; xe.AppendChild(xe1); //NAME添加 XmlElement xe2 = xdoc.CreateElement("NAME"); xe2.InnerText = TextBox2.Text; xe.AppendChild(xe2); XmlElement xe3 = xdoc.CreateElement("ADRESS"); xe3.InnerText = TextBox2.Text; xe.AppendChild(xe3); XmlElement xe4 = xdoc.CreateElement("CALL"); xe4.InnerText = TextBox3.Text; xe.AppendChild(xe4); XmlElement xe5 = xdoc.CreateElement("JOP"); xe5.InnerText = TextBox4.Text; xe.AppendChild(xe5); XmlElement xe6 = xdoc.CreateElement("JOPP"); xe6.InnerText = TextBox5.Text; xe.AppendChild(xe6); node.AppendChild(xe); xdoc.Save(Server.MapPath("basic.xml")); Response.Write("<script>alert('添加成功!');</script>"); } //RemoveChild 删除节点 protected void Button3_Click(object sender,EventArgs e) { XmlNode node = xdoc.DocumentElement.SelectSingleNode("basic[NAME='" + this.DropDownList1.Text + "']"); if (node != null) { xdoc.DocumentElement.RemoveChild(node); this.DropDownList1.Items.RemoveAt(this.DropDownList1.SelectedIndex); xdoc.Save(Server.MapPath("basic.xml")); } } //修改内容 protected void Button4_Click(object sender,EventArgs e) { XmlElement xmle = (XmlElement)xdoc.DocumentElement.SelectSingleNode("basic[NAME='" + this.DropDownList1.Text + "']"); xmle.GetElementsByTagName("ADDRESS").Item(0).InnerText = TextBox2.Text; xmle.GetElementsByTagName("CALL").Item(0).InnerText = TextBox3.Text; xmle.GetElementsByTagName("JOP").Item(0).InnerText = TextBox4.Text; xmle.GetElementsByTagName("JOPP").Item(0).InnerText = TextBox5.Text; xdoc.Save(Server.MapPath("basic.xml")); Response.Write("<script>alert('修改成功!');</script>"); }
这样一来,便实现了通过增删改查按钮对XML中的数据进行操作并显示在Gridview中。
从上面的代码可以看出,对XML的操作主要是利用其先天的根结构特点,将其每个节点视为对象,通过RemoveChild()、AppendChild()、SelectSingleNode()等常用方法,对数据进行增删改查操作。所以这也体现了我们开头所谈的xml具有清晰的数据结构层次,且符合面向对象编程思想。