本次实验是我和小组成员在Windows程序设计课程上负责,并需要上台跟同学们讲解演示的,除了展示设计的程序对XML文件进行的操作外,还需要首先了解XML文件,给同学们介绍XML文件
XML文件XML(Extensible Markup Language)称为可扩展标记语言,和HTML一样,都是标准通用标记语言。XML的应用场合非常多,在应用程序中它可被作为配置文件,在json中用来传递对象,复杂的SOAP网络通信协议是基于XML格式的,它还应用到了数据存储领城,XML文件也类似于数据库,提供数据的结构化视图。
1.XML文档和HTML
XML文档是纯文本文件,几乎所有程序语言都支持文本文件的处理,只要遵循统一的目的,XML文件可以实现跨操作系统平台,与编程语言无关。
网页语言HTML称为静态网页是一种标记语言,通过事先定义的不同文本标签作为网页内容的说明,HTML语言的标签所代表的意义是固定不变的,它的标签数量固定,每种标签预定义了内容的显示格式,各种浏览器显示网页的结果也几近相同。重在数据的显示模式,部分HTML标签没有关闭标签。
XML文件吸收了HTMI语言中使用标签来定义内容的方式,XML也是一种标记语言,但XML仅规定最基本的文件结构语法,它的主要目的是以结构化的方式来表示数据,XML 没有对标签进行预定义.标签及其内容统统属于用户自定义,也就是说标签的意义由用户自由定义,也称作自我描述性,并且由用户自定义和解析.XML.扩展性比HTML强,还有XML元素都须有关闭标签。
学习XML印象最深的是它的树结构,XML文档对象模型(DOM)类是XML文档在内存中的表示形式,编辑是DOM的主要功能,实际上XML数据在文件中时嚯从另一个对象传入时用线性方式存储,读入内存后,采用的是结构化表示方法——在笔者看来它结构化的内存构造也就是树结构
我认为这是XML文档最鲜明的特点
XML文档必须包含根元素,是所有其他元素的父元素
元素共同形成了一颗文档树,从根开始一层一层往下,直到扩展到树的最低端
以下文的XML文档内容为例:
Carson 31.95 05/01/2001 MSPress WA
book.xml的DOM对象模型如下:
第一行是XML说明,可以看出根元素就是文档内容的最外层
同样也是在VS上创建WIindows窗体程序设计(基于.net平台)的项目,.net平台提供了操作XML文件的类:
XmlReader类用于读入XML文档,它也可用于创建XML文档;
XmlWriter类用于向XML文档内写入内容;
XmlNode类用于XML结点的操作
Xmldocument类(扩展XmlNode)支持用于对整个文档执行操作(例如,将文档加载到内存中或将XML保存到文件中)的DOM方法,Xmldocument表示整个XML文档中的内存对象,操作XML必须要先创建这个对象
4.使用DOM操作XML文档主要介绍操作XML文档的DOM方法,窗体设计如下
1.创建XML文件在窗体上放置textBox控件设为多行文本,treeView控件以及按钮,在创建XML文件按钮事件加入代码,用于生成一个XML文档,并保存为bookstore.xml
//创建一个XML文档
Xmldocument xmlDoc = new Xmldocument();
xmlDoc.LoadXml(" ");
//创建XML版本声明
XmlDeclaration xmldec1;
xmldec1 = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
//根节点
XmlNode root = xmlDoc.documentElement;
xmlDoc.InsertBefore(xmldec1, root);
//创建一个结点
XmlElement xe1 = xmlDoc.CreateElement("book");
//设置该结点genre属性
xe1.SetAttribute("genre", "黄敏");
//设置该结点ISBN属性
xe1.SetAttribute("ISBN", "2-3631-4");
XmlElement xesub1 = xmlDoc.CreateElement("title");
xesub1.InnerText = "CS从入门到精通"; //设置文本结点
xe1.AppendChild(xesub1);
XmlElement xesub2 = xmlDoc.CreateElement("author");
xesub2.InnerText = "侯捷";
xe1.AppendChild(xesub2);
XmlElement xesub3 = xmlDoc.CreateElement("price");
xesub3.InnerText = "58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);
xmlDoc.Save("bookstore.xml");
在创建XML文档时,使用了Xmldocument类的documentElement成员,它代表文档的根结点;
XmlDeclaration类代表XML文档的版本声明部分,通过Xmldocument类的InsertBefore方法,将声明插入到根结点前;
Xmldocument类的CreateElement用于创建一个普通的XmlElement结点对象,使用XmlElement的AppendChild方法添加结点的子结点对象;
最后使用Xmldocument类的Save方法将生成的XML文档给定的文件名进行保存
2.显示XML文本内容放入一个openFileDialog控件,用户单击按钮后,将XML文本内容显示在文本框中,文档名记录在全局变量中
openFileDialog1.InitialDirectory = Directory.GetCurrentDirectory();
openFileDialog1.Filter = "XML文档|*.xml";
StreamReader sr = null;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
xml_fileName = openFileDialog1.FileName;
sr = new StreamReader(xml_fileName);
textBox1.Text = sr.ReadToEnd();
sr.Close();
}
3.显示XML结点的DOM树结构
XML文档的结点元素在DOM中构成了一棵树,这里用TreeView
Xmldocument doc = new Xmldocument();
if (File.Exists(xml_filename))
{
doc.Load(xml_filename);
treeView1.Nodes.Clear();
XmlNode root = doc.documentElement;
TreeNode node;
node = treeView1.Nodes.Add("XML文档");
build_tree(root, node);
treeView1.ExpandAll();
}
4.查找与修改结点
Xmldocument xmlDoc = new Xmldocument();
xmlDoc.Load("bookstore.xml");
XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
//获取bookstore结点的所有子节点
//遍历所有子结点
foreach (XmlNode xn in nodeList)
{
//将子结点类型转换为XmlElement类型
XmlElement xe = (XmlElement)xn;
//如果 genre 属性值为黄敏
if (xe.GetAttribute("genre") == "黄敏")
{
//则修改该属性为“update黄敏”
xe.SetAttribute("genre", "update 黄敏");
//继续获取 xe 子结点的所有子结点
XmlNodeList nls = xe.ChildNodes;
foreach (XmlNode xnl in nls) //遍历
{
XmlElement xe2 = (XmlElement)xnl; //转换类型
//找到结点名称
if (xe2.Name == "author")
{
xe2.InnerText = "亚胜";
break; //找到了就退出来
}
}
break;
}
}
xmlDoc.Save("bookstore.xml"); //保存
5.使用Schema验证XML文件
XmlSchemaSet sc = new XmlSchemaSet();
sc.Add("urn:bookstore-schema", "books.xsd");
XmlReaderSettings settings = new XmlReaderSettings();
// ConformanceLevel = ConformanceLevel.document
settings.ValidationType = ValidationType.Schema;
settings.Schemas = sc;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);
//Parse the file
while (reader.Read()) ;



