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();
        }
XmlDocument的使用:
• 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
    }

}

posted on 2006-06-06 10:42  公木子  阅读(370)  评论(0)    收藏  举报