1.1 什么是XML(eXtensible Markup
Language)?
– XML是标记语言
– XML是可扩展的(eXtensible)标记语言。
XML并非象HTML那样,提供了一组事先已经定义
好了的标记,而是提供了一个标准,利用这个标
准,可以根据实际需要定义自己的新的标记语言,
并为这个标记语言规定它特有的一套标记。准确地
说,XML是一种元标记语言,它允许程序开发人员
根据它所提供的规则,制定各种各样的标记语言。
HTML是专门为描述主页的表现形式而设计的,它
疏于对信息语义及其内部结构的描述,不能适应
日益增多的信息检索要求和存档要求。
HTML对表现形式的描述能力实际上也还是非常不
够的,它无法描述矢量图形、科技符号和一些其
他的特殊显示效果。
HTML的标记集日益臃肿,而其松散的语法要求使
得文档结构混乱而缺乏条理,导致浏览器的设计
越来越复杂,降低了浏览的时间效率与空间效率。
良好的可扩展性
内容与形式的分离
遵循严格的语法要求
便于不同系统之间信息的传输
具有较好的保值性
SGML(1985)
–异常强大,极好的
扩展性
–非常复杂,昂贵,
浏览器厂商拒绝支持
HTML(1993)
–免费,简单,获得广
泛的支持
–如前所述,很多与生
俱来的弱点
XML(1998.2由W3C颁布推荐标准)
–既具有SGML的强大功能和可扩展性
–又具有HTML的简单性
1.7 XML语法
• “格式良好的”XML文档
• XML文档的逻辑结构
• XML文档的物理结构
“格式良好的”XML文档
• 在XML中,“格式良好的”有着明确的标准,即是要遵守
XML1.0规范中的语法规则。无论是从物理结构上讲,
还是从逻辑结构上讲,XML文档都必须符合规范,才能
被正确解释处理。
– 文档包含一个或多个元素
– 文档中只存在一个称为根的元素,或文档元素,该元
素无任何部分出现在其他元素中
– 元素必须正确关闭
– 元素不得交叉
– 属性值必须加引号
逻辑结构之一——XML声明
<?xml version="1.0" encoding="GB2312" standalone= "no"?>
– version属性:指明所采用的XML版本号
– standalone属性:这个属性表明该XML文档是否和
一个外部的文档类型定义DTD配套使用
– encoding属性:指明XML数据所采用的编码标准
逻辑结构之二——元素
<标记属性名="属性取值" ...>数据内容</标记>
• 标记必不可少:XML文档至少要有一个元素
• 大小写有别:<HELLO>和<hello>截然不同
• 要有正确的结束标记:严格要求标记配对
– 结束标记要和起始标记在拼写和大小写上完全相同
– 必须在结束标记前面加上一个斜杠“/”,如<hello>...</hello>
– 当一对标记之间没有任何文本内容时,可以使用“空标记”,如<hr/>。
• 标记要正确嵌套:<a><b></a></b>是错误的
• 有效使用属性:属性以名称/取值对出现,名称与取值之间用
等号“=”分隔,属性名不能重复,且取值用引号引起来
• 标记命名要合法:符合命名规范
• 在标记CDATA下,所有的标记、实体
引用都被忽略,一律当作字符数据看待。
– CDATA的文本内容中不能出现字符串“]]>”
– CDATA不能嵌套
逻辑结构之三——CDATA
逻辑结构之四——注释
<示例>
<!-- 一个XML的例子-->
<![CDATA[
<联系人>
<姓名>张三</姓名>
<EMAIL>
zhang@aaa.com
</EMAIL>
</联系人>
]]>
</示例>
在注释文本中不能出现字符“-”或字符串
“--”,XML处理器可能把它们和注释结尾
标志“-->”相混淆
不要把注释文本放在标记之中
<示例<!-- 一个XML的例子--> >错误
注释不能被嵌套
<!-- 一个XML的例子
<!--以上是一个注释-->
--> 错误
DataSet方法
DataSet.ReadXml(string strFileName);
DataSet.WriteXml(string strFileName));
private void btnSubmit_Click(object sender, System.EventArgs e)
{
DataSet ds = new DataSet("myDs");
//从XML中读取数据
ds.ReadXml(Server.MapPath(@".\db\dbGuest.xml"));
//以下为添加记录
DataRow dr = ds.Tables[0].NewRow();
dr["Name"] = tbName.Text.Trim();
dr["City"] = tbCity.Text.Trim();
dr["Email"] = tbEmail.Text.Trim();
dr["Message"] = tbComments.Text.Trim();
dr["STime"] = DateTime.Now.ToString();
ds.Tables[0].Rows.Add(dr);
//写回XML
ds.WriteXml(Server.MapPath(".\\db\\dbGuest.xml"));
Response.Redirect("view.aspx");
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath(@".\db\dbGuest.xml"));
dgShow.DataSource = ds.Tables[0].DefaultView;
dgShow.DataBind();
}XML文件的读写
• foreach( XmlNode personElement in
root.ChildNodes )
• XmlTextWriter的使用
private void LoadXMLButton_Click(object sender, System.EventArgs e)
{
// 创建XmlDocument类的实例
XmlDocument doc = new XmlDocument();
ArrayList NodeValues = new ArrayList();
// 把people.xml文件读入内存,形成一个DOM结构
doc.Load( Server.MapPath("people.xml") );
XmlNode root = doc.DocumentElement;
foreach( XmlNode personElement in root.ChildNodes )
NodeValues.Add(personElement.FirstChild.Value);
XMLNodeListBox.DataSource = NodeValues;
XMLNodeListBox.DataBind();
}• Load
• SelectSingleNode
• CreateElement
• Save
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
Bind();
}
private void Bind()
{
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath(".\\db\\dbGuest.xml"));
dgShow.DataSource = ds.Tables[0].DefaultView;
dgShow.DataBind();
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNodeList elemList = doc.GetElementsByTagName("Name");
ddlName.Items.Clear();
for(int i=0;i<elemList.Count;i++)
ddlName.Items.Add(elemList[i].InnerXml);
}
Web Form Designer generated code
private void btnQuery_Click(object sender, System.EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
lbEmail.Text = doc.SelectSingleNode("//User[Name='"+ddlName.SelectedItem.Text+"']").ChildNodes.Item(2).InnerText;
}
private void btnChange_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNodeList nodeList=xmlDoc.SelectSingleNode("dbGuest").ChildNodes;//获取dbGuest节点的所有子节点
foreach(XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
XmlNodeList node = xe.GetElementsByTagName("Name");
if(node.Count>0)
{
if(node[0].InnerText==ddlName.SelectedItem.Text)
{
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
{
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="Email")//如果找到
{
xe2.InnerText=tbNewMail.Text;//则修改
break;//找到退出来就可以了
}
}
break;
}
}
}
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}
private void btnDelete_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNodeList xnl=xmlDoc.SelectSingleNode("dbGuest").ChildNodes;
foreach(XmlNode xn in xnl)
{
XmlElement xe=(XmlElement)xn;
XmlNodeList node = xe.GetElementsByTagName("Name");
if(node.Count>0)
{
if(node[0].InnerText==ddlName.SelectedItem.Text)
xe.RemoveAll();//删除该节点的全部内容
break;
}
}
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}
private void btnAdd_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNode root=xmlDoc.SelectSingleNode("dbGuest");//查找<dbGuest>
XmlElement xe1=xmlDoc.CreateElement("User");//创建一个<User>节点
XmlElement xesub1=xmlDoc.CreateElement("Name");
xesub1.InnerText="Guset";//设置文本节点
xe1.AppendChild(xesub1);//添加到<User>节点中
XmlElement xesub2=xmlDoc.CreateElement("City");
xesub2.InnerText="上海";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("Email");
xesub3.InnerText="ss@22.net";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<dbGuest>节点中
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}XML文件的验证
• XML 文档验证和XML 段落验证是使用
XmlValidatingReader 类实施的,该类通
过实现W3C 建议所定义的有效性约束来提
供DTD、数据简化XML (XDR) 和XML 架
构定义语言(XSD) 架构验证服务。
• XmlValidatingReader 类实现XmlReader
类,并以只进方式对XML 流执行验证。
public class ValidateXML : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
FileStream stream = new FileStream(Server.MapPath("people.xml"), FileMode.Open);
//创建XmlValidatingReader类的对象
XmlValidatingReader vr = new XmlValidatingReader(stream, XmlNodeType.Element, null);
//加载XML架构文档
vr.Schemas.Add(null, Server.MapPath("people.xsd"));
//说明验证的方式是根据XML架构
vr.ValidationType = ValidationType.Schema;
vr.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);
//对文档进行验证
while(vr.Read());
//显示验证过程完成
Page.Response.Write("<b>Validation finished!<b>");
//关闭打开的文件
stream.Close();
}
private void ValidationHandler(object sender, ValidationEventArgs args)
{
//显示验证失败的消息
Page.Response.Write("<b>Validation error: </b>" + args.Message + "<p>");
}
Web 窗体设计器生成的代码
}用XML传送图片
• XmlDocument类的使用
Byte[] bt = new Byte[size];
String strData;
• 把字节组转换为字符串:
– String str=Convert.ToBase64String(bt);
• 把字符串转换为字节组
– bt =Convert.FromBase64String(strData)
private void btnUpload_Click(object sender, System.EventArgs e)
{
//得到用户要上传的文件名
string strFilePathName = loFile.PostedFile.FileName;
string strFileName = Path.GetFileName(strFilePathName);
int FileLength = loFile.PostedFile.ContentLength;
if(FileLength<=0)
return;
try
{
Byte[] FileByteArray = new Byte[FileLength]; //图象文件临时储存Byte数组
Stream StreamObject = loFile.PostedFile.InputStream; //建立数据流对像
//读取图象文件数据,FileByteArray为数据储存体,0为数据指针位置、FileLnegth为数据长度
StreamObject.Read(FileByteArray,0,FileLength);
string fileName = Server.MapPath(".\\WriteXml.xml"); //要打开的文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
XmlNode root=xmlDoc.SelectSingleNode("dbImage");//查找<dbGuest>
XmlNodeList xnl=xmlDoc.SelectSingleNode("dbImage").ChildNodes;
int nIndex = xnl.Count;
//以下添加新结点
XmlElement xe1=xmlDoc.CreateElement("Image");//创建一个<User>节点
XmlElement xesub1=xmlDoc.CreateElement("ImageID");
xesub1.InnerText=nIndex.ToString();//设置文本节点
xe1.AppendChild(xesub1);//添加到<User>节点中
XmlElement xesub2=xmlDoc.CreateElement("ImageContentType");
xesub2.InnerText=loFile.PostedFile.ContentType;
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("ImageSize");
xesub3.InnerText=FileLength.ToString();
xe1.AppendChild(xesub3);
XmlElement xesub4=xmlDoc.CreateElement("ImageDescription");
xesub4.InnerText=tbDescription.Text;
xe1.AppendChild(xesub4);
XmlElement xesub5=xmlDoc.CreateElement("ImageData");
xesub5.InnerText= Convert.ToBase64String(FileByteArray);
xe1.AppendChild(xesub5);

root.AppendChild(xe1);//添加到<dbGuest>节点中
xmlDoc.Save(fileName);
Response.Redirect("ShowAllImg.aspx");
}
catch
{
}
}
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.IO;
using System.Xml;
namespace UseFramework2.DBAndImage
{
/// <summary>
/// show 的摘要说明。
/// </summary>
public class ShowImg : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
int ImgID = Convert.ToInt32(Request.QueryString["ID"]); //ID为图片ID
//建立数据库链接
string fileName = Server.MapPath(".\\WriteXml.xml"); //要打开的文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
XmlNodeList node = xmlDoc.SelectSingleNode("//Image[ImageID='"+ImgID.ToString()+"']").ChildNodes;
if(node!=null)
{
string strType = node.Item(1).InnerText;
string strData =node.Item(4).InnerText;
int nSize = int.Parse(node.Item(2).InnerText);
Response.ContentType = strType;//设定输出文件类型
//输出图象文件二进制数制
Response.OutputStream.Write(Convert.FromBase64String(strData), 0, nSize);
Response.End();
//也可以保存为图像
// FileStream fs = new FileStream(@"C:\aa.BMP", FileMode.OpenOrCreate, FileAccess.Write);
// fs.Write((Convert.FromBase64String(strData), 0,nSize);
// fs.Close();
}
}
Web Form Designer generated code
}
}

浙公网安备 33010602011771号