- XML用处
存储配置文件,存储数据用于远程传输等。.net提供了system.xml命名空间的类,用于读写xml文件(XmlTextReader、XmlWriter),分析xml文件结构(XmlNode、XmlDocument),转换xml文件格式成其他格式文件(XmlTransform),用xml类处理数据,用XPath类在xml文件查询。
- 理解XML
XML。SGML通用标记语言的子集,这语言派生出HTML和XML。XML是与人工可读元数据相结合的人工可读数据。元素,包含一对标签和一个值。xml允许空白增强可读性,类似C#每行前面的空格。xml和html一样,都是由成对标记和数据组成<br /br>,/,<p/>代表一对P标签,其他类似。< />一对空标记
xml可按规则随意给元素起名(<city>berlin</city>),规则是名称是任何字母数字字符专用字符,没空白,以字母或下划线开始。例如元素<city>berlin</city>,名称是city,值是berlin。元素可嵌套,不能重叠(即在同一上级里重复,xml文件,从数据结构看,是一棵树),用ie打开xml即可查看xml的内容。
xml命名空间,在xsd文档(用xml表示数据库结构的文档),有xmlns=,代表这个xml的namespace,=后面是命名空间名,xmlns: 是引用其他命名空间。同名xml元素,用命名空间区分,例如,xs是用前缀xmlns标记的using的其他命名空间名,这里表示element标记来自xs命名空间<xs : element name="address" type="xs:string" minOccurs="0"/>。
也可用特性表示xml内容。有时用元素表示,并嵌套;还可以用特性表示xml内容,一个特性,就是一个单元格数据,包含在一个元素内,这里的一个元素,代表一行数据。
xml内容里可以有转义字符。如<: 代表<,&apos: 代表单引号‘等;还可以用cdata标记这是整个字符串,这个字符串不包含语法方面的符合,例如<![cdata[[email protected]#$]]>中的[email protected]#$,就被标记成字符串。
注释和处理指令。如<? ?>是给电脑看的处理指令,<-- -->是给人看的注释,不能嵌套。例如这个处理指令把样式表与当前文件联系起来<?xml-stylesheet href="customers.css" type="text/css"?>
- XSLT
是一个转换xml的转换器,xsl文件包含与xml元素对应的格式信息(如xml某个名称节点的换行br,段落p等),与xml文件一起,可把xml文件输出成html(把xlt在xml对应元素上的格式,加入到xml数据)、txt、word等几乎任何文件格式。可在xml文件中指定xls样式文件,<?xml-stylesheet type="text/xsl" href="cust.xsl"?>。样式文件cust.xlt中,body中没有标记命名空间的元素,会当做xml文件的样式(前面用ie打开xml,就是调用了ie中内置的xslt这个转换器,加载xml文件中绑定的xls文件,把xml显示出来)。样式文件,其实就是xhtml文件(用xml重写的html4.01),xlt中可以使用foreach循环,例如用来找xml文件中的所有指定的元素名称select=,还可以用value-of返回找到元素的值。需要注意的是xml中的标记一定要成对出现,html可省略后面的,例外是这种一个的标记<p/>。
- XSD
描述数据库架构。
引用命名空间。例如xmlns:mstns=“http://tempuri.org/dataset1.xsd”
定义dataset元素内容,从这里开始,例子是连续的。例如<xs:element name="dataset1" msdata:isdataset="true">
定义dataset元素包含的数据数量。例如 <xs:conplextype> <xs:choice maxOccrurs="unbounded">,无限数据。
定义在dataset元素中的数据元素。例如<xs:element name="customers">
定义表的列。每开始一级,就加<xs:complexType>。<xs:sequence> <xs:element name ="custeomerID" type ="xs:string" />
定义表的主键。
其他可参看vs在线帮助中“xsd架构参考”
- 写XML
读写XML,类似流和输入输出那章的内容。
写XML文件。用XmlTextWriter类,派生自XmlWriter类。过程是
XmlTextWriter xw new XmlTextWriter(@“本地目录和文件名.xml",system.text.encoding.utf8);//在指定目录新建指定的xml文件,指定字符集
xw.writestartdocument;//开始写文档
xw.writestartelement(”newdataset“);//写一个元素标签头
xw.writestratelement("customers");//再写一个元素标签头,因上一个元素没结束,所以这个嵌套在上一个元素内。
xw.writeelementstring(”coustomerID“,”ID1“);//在上一个标签头内容,写一个元素名和元素值
...//写其他元素
xw.writeendelement();上一个元素完成,customers的,对应数据库的一行数据
xw.writestartelement(”customers“);//写另一行数据
...
xw.writeendelement();//这行数据完成
xw.writeendelement();//newdataset元素dataset完成,dataset可含多个表
xw.writeendDocument();//完成文档写。
xw.flush();//内存的数据,提交到存储
xw.close();
...
XmlTextWriter类自动写xml文件的声明。没在这个文件写空白和非默认的格式信息。
- DOM文档对象模型
XmlDataDocument用于同步DataSet和xml,继承自xmlDocument类,xmldoucument类是DOM的一个实现。
DOM。是接口,用于程序和脚本动态地访问和更新文档内容、文档结构、文档样式。XML文件和HTTP文件以节点树形式保存DOM标准,DOM是W3C的正式标准。DOM标准是一组标准,包括XML DOM、DHTML DOM(动态HTML文档的表示标准)。不可能支持整个COM标准,.NET框架包括对DOM Level 1 Core和DOM Level 2 Core规范的支持,还通过向DOM规范添加额外的对象、方法、属性来扩展DOM,Internet厂商一般也都这样做,具体厂商是如何执行的,需要参照厂商的文档。 DOM具体标准在www.w3.org/dom
XML DOM在.net的实现。XmlNode类和XmlDocument类实现XML DOM。XmlNode表示XML文件的一个基本部分。XmlDocument把整个文件表示为XmlNode对象的集合。
XmlNode类。从前面的可看出,XML文档就是一系列互相嵌套的元素和特性,都可转换为树结构,元素和特性都表示为节点,XmlNodeType枚举表示节点的类型,从技术上讲,特性是父元素的属性,使用XmlNode可以读取和设置节点属性。另外根据节点类型,派生出XMLAttribute类、XmlComment类、XmlElement类。XmlNode的NodeType属性包含元素element、特性Attribute、特性元素其他节点的文本内容text等,XmlNode的Attributes属性是此node的特性,XmlNode的haschildnodes属性,XmlNode的nextsibling属性获得树中下一个node,xmlNamedNodeMap是多个节点集合
XmlDocument类。继承自XmlNode类,XmlDocument的DocumentElement属性表示文档XML根元素。XmlDataDocument继承自xmlDocument继承在XmlNode。
- 读XML文件
用xmlreader抽象类的3个派生类,xmlValidatingReader,XmlNodeReader类,XmlTextReader,返回用文档对象模型DOM承载的XML文件信息。xmlTextReader属性WhitespaceHandling表示空白如何处理。
读取过程。使用xmlTextReader读取文件,使用XmlDocument的Load方法,把内容加入到XmlDocument中,并按标准格式化,用XmlDocument的DocumentElement属性获取跟节点,用每个节点的NextSibling属性依次获取下一个节点,知道获取不到下一个节点,用XmlNode的name和value属性获取每个节点的名称和值,用节点的Attributes属性获取每个节点的特性集(保存到xmlNamedNodeMap的对象里,每个特性也有name和value属性)。
- 转换XML
通过system.xml.Xsl命名空间的对象实现。如XslTransform类。
转换过程。创建XmlTextReader对象读xml文件,用XmlDocument的load方法标准化数据,用XslTransform的load方法读取xsl样式文件,创建MemoryStream对象,用读取了xsl的XslTransform对象的Transform方法转换XmlDocument中的数据,同时把转换后的数据保存到MemoryStream,把MemoryStream内容的起始位置设为1,创建关联了MemoryStream的StreamReader,用StreamReader的ReadToEnd方法,输出转换后的内容,这内容默认是html格式。
XslTransform类的transform方法有一些重载的格式,实现输出到MemoryStream以为的对象,如netStream跨网络发送转换后的数据,StringWriter发送给某个文件。
- 在XML查询数据
用XPath标准。