您的当前位置:我要购书网>在线阅读>ASP/PHP/.NET/XML

dom访问xml-asp.net入门(九)

来源:互联网  作者:  发布:我要购物网收集整理  发布时间:2006-8-31 人气:167

Dom访问Xml笔记一.Xml文件格式. 二.概述. 三.几种操作. 3.1添加... 3.2 修改... 3.3 删除... 3.4 复制到另一xml 3.5 除全部... 四.补充. 五.Xpath语法. 5.1 比较常见的... 5.1.1 选择所有的该类元素... 5.1.2 有条件的选择元素... 5.1.3 选择包含有某属性的元素... 5.1.4 选择包含有属性的元素... 5.1.5 选择属性值为**的元素... 5.2 以下是我从网上摘抄下来的。... 5.2.1 文档一... 5.2.2 文档二... Dom访问Xml笔记

在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型。下面是我的学习笔记,主要是学习怎样用Dom访问Xml。

一.Xml文件格式

以下是用到的xml文件,名为contack.xml(其实是写错了,是contact.xml)

luo

luo

luoandluo

二.概述

DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。(不好意思,都是抄的:),说理解吗,也是有的。

三.几种操作

3.1添加

string strXmlPath;

strXmlPath = Server.MapPath("Contack.xml");

XmlDocument xDoc = new XmlDocument();

xDoc.Load(strXmlPath);

XmlElement xEle = null;

//首先查找是否已经存在要添加

xEle = (XmlElement)xDoc.SelectSingleNode(string.Format("//Name[First='{0}' and Last='{1}']",FirstName.Text,LastName.Text));

if (xEle!=null) //已经存在

{

Label3.Text = "already exist";

}

else //不存在,可以添加

{

XmlDocumentFragment xDocFrag = xDoc.CreateDocumentFragment();

XmlElement xContact = xDoc.CreateElement("Contact");

XmlElement xName = xDoc.CreateElement("Name");

XmlElement xFirst = xDoc.CreateElement("First");

xFirst.InnerText = FirstName.Text;

XmlElement xLast = xDoc.CreateElement("Last");

xLast.InnerText = LastName.Text;

xName.AppendChild(xFirst);

xName.AppendChild(xLast);

XmlElement xNote = xDoc.CreateElement("Note");

xNote.InnerText = FirstName.Text+"and"+LastName.Text;

xContact.AppendChild(xName);

xContact.AppendChild(xNote);

xDocFrag.AppendChild(xContact);

XmlNode xRoot = null;

xRoot = xDoc.SelectSingleNode("//ContactDetails"); //ContactDetails

if (xRoot!=null)

{

//xRoot.AppendChild(xDocFrag.FirstChild);// 加在最后

xRoot.PrependChild(xDocFrag.FirstChild); //加在最前,做为第一个子节点

//还有InsertBefore,InsertAfter(new,old)

xDoc.Save(strXmlPath);

Label3.Text = "add sucess"; //

}

else

{

Label3.Text = "add failed";

}

3.2 修改

string str = Server.MapPath("Contack.xml");

XmlDocument xDoc = new XmlDocument();

xDoc.Load(str);

XmlElement xEle = null;

//查看要修改的元素是否存在

xEle = (XmlElement)xDoc.SelectSingleNode(string.Format("//Name[First='{0}' and Last='{1}']",FirstName.Text,LastName.Text));

if (xEle==null) //不存在

{

Label5.Text = "no exist";

}

else //存在

{

//下面是一种方法

/*xEle.ChildNodes[0].InnerXml = FirstName.Text + "Replace";

xEle.ChildNodes[1].InnerXml = LastName.Text + "Replace";

xEle.NextSibling.InnerXml = FirstName.Text + "and" + LastName.Text + "Replace";*/

//也可以这样

//true表示递归地克隆指定节点下的子树

XmlElement xNodeCopy = (XmlElement)xEle.CloneNode(true);//

xNodeCopy.ChildNodes[0].InnerXml = FirstName.Text + "Replace";

xNodeCopy.ChildNodes[1].InnerXml = LastName.Text + "Replace";

//xNodeCopy.NextSibling.InnerXml = FirstName.Text + "and" + LastName.Text + "Replace";

//xNodeCopy.ParentNode.ReplaceChild(xNodeCopy,xEle); //这样是错误的,因为xNodeCopy只是clone了这个点及子点,并没有父点

xEle.ParentNode.ReplaceChild(xNodeCopy,xEle);

}

xDoc.Save(str);

}

3.3 删除

string str;

str = Server.MapPath("Contack.xml");

XmlDocument xDoc = new XmlDocument();

xDoc.Load(str);

XmlElement xEle = null;

//查找是否有存在指定的点

xEle = (XmlElement)xDoc.SelectSingleNode(string.Format("//Name[First='{0}' and Last='{1}']",FirstName.Text,LastName.Text));

if (xEle!=null) //存在

{

xEle.ParentNode.ParentNode.RemoveChild(xEle.ParentNode);

Label6.Text = "delete sucess";

}

else

{

Label6.Text = "no find";

}

xDoc.Save(str);

3.4 复制到另一xml

string strSrc,strDst;

strSrc = Server.MapPath("Contack.xml"); //源文件

strDst = Server.MapPath("Dst.xml"); //目标文件

XmlDocument xSrcDoc = new XmlDocument();

xSrcDoc.Load(strSrc);

XmlDocument xDstDoc = new XmlDocument();

xDstDoc.Load(strDst);

XmlNodeList xList = null;

XmlNode xDstNode = null;

//假定目标xml中已经存在ContactDetails元素

xDstNode = xDstDoc.SelectSingleNode("//ContactDetails");

xList = xSrcDoc.SelectNodes("//Contact"); //选择所有的点

if (xList!=null&&xDstNode!=null)

{

foreach (XmlNode xNode in xList)

{

XmlNode xNodeImp = xDstDoc.ImportNode(xNode,true); //不同xml的 node需导入后才可以在自己的xml 中用

xDstNode.AppendChild(xNodeImp);

}

}

xDstDoc.Save(strDst);

3.5 除全部

string strDst;

strDst = Server.MapPath("Dst.xml");

XmlDocument xSrcDoc = new XmlDocument();

xSrcDoc.Load(strDst);

//xSrcDoc.DocumentElement.FirstChild.RemoveAll(); //还剩下头节点

xSrcDoc.DocumentElement.RemoveAll(); //删除全部节点

xSrcDoc.Save(strDst);

四.补充

由PrependChild, AppendChild,ReplaceChild, RemoveChild, AppendChild函数可知道,他们的操作都是 父元素.成员函数(操作),所以一般要先找到父元素,Node.ParentNode可以找到

仔细看看用到的类,很多都是直接或间接从XmlNode派生的

五.Xpath语法

5.1 比较常见的

5.1.1 选择所有的该类元素

//Name

Contack.xml中所有的Name元素

5.1.2 有条件的选择元素

//Name[FirstName='flypig' and LastName='luo']

Contack.xml中FirstName='flypig' 并且 LastName='luo'的Name元素

5.1.3 选择包含有某属性的元素

//cd[@country]

选择所有含有country这个属性的cd元素.

5.1.4 选择包含有属性的元素

//cd[@*]

选择出含有属性的所有cd元素

5.1.5 选择属性值为**的元素

//cd[@country='UK']

选择出country属性值为UK的cd元素

5.2 以下是我从网上摘抄下来的。

5.2.1 文档一

XPath 是XML的查询语言,和SQL的角色很类似。以下面XML为例,介绍XPath 的语法。

Empire Burlesque

Bob Dylan

10.90

Hide your heart

Bonnie Tyler

9.90

Greatest Hits

Dolly Parton

9.90

定位节点

XML是树状结构,类似档案系统内资料夹的结构,XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern),可以选出 XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:

/catalog/cd/price

如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):

//cd

选择未知的元素

使用星号(Wildcards,*)可以选择未知的元素。下面这个语法会选出/catalog/cd 的所有子元素:

/catalog/cd/*

以下的语法会选出所有catalog的子元素中,包含有price作为子元素的元素。

/catalog/*/price

以下的语法会选出有两层父节点,叫做price的所有元素。

/*/*/price

以下的语法会选择出文件中的所有元素。

//*

要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

选择分支

使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。

/catalog/cd[1]

以下语法选择catalog中的最后一个cd元素:(XPathj并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素。

/catalog/cd[last()]

以下语法选出含有price子元素的所有/catalog/cd元素。

/catalog/cd[price]

以下语法选出price元素的值等于10.90的所有/catalog/cd元素

/catalog/cd[price=10.90]

以下语法选出price元素的值等于10.90的所有/catalog/cd元素 的price元素

/catalog/cd[price=10.90]/price

选择一个以上的路径

使用Or操作数(|)就可以选择一个以上的路径。例如:

/catalog/cd/title | catalog/cd/artist

选择所有title以及artist元素

//title | //artist

选择所有title以及artist以及price元素

//title | //artist | //price

选择属性

在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性:

//@country

选择所有含有country这个属性的cd元素:

//cd[@country]

以下语法选择出含有属性的所有cd元素

//cd[@*]

以下语法选择出country属性值为UK的cd元素

//cd[@country='UK']

5.2.2 文档二关于XPath节点匹配路径Xpath

在利用XSL进行转换的过程中,匹配的概念非常重要。在模板声明语句xsl:template match = ""和模板应用语句xsl:apply-templates select = ""中,用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在XPath中给出。另外,也可以使用Xpath对XML文档进行搜索、定位。之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点。

在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基本概念。首先要说的是XPath数据类型。XPath可分为四种数据类型:

节点集(node-set)节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。

布尔值(boolean)由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和false两个值。布尔值可以和数值类型、字符串类型相互转换。

字符串(string)字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。

数值(number)在XPath中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。由于XML文档的逻辑结构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath中,将节点划分为七种节点类型: 根节点(Root Node)根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。

元素节点(Element Nodes)元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。

文本节点(Text Nodes)文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。

属性节点(Attribute Nodes)每一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为#IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。

命名空间节点(Namespace Nodes)每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。

处理指令节点(Processing Instruction Nodes)处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。

注释节点(Comment Nodes)注释节点对应于文档中的注释。下面,我们来构造一棵XML文档树:

相关文章
· dotnet中 “iis 中没有将虚拟目录作为应用程序进..
· dom属性用法速查手册
· dom访问xml-asp.net入门(九)
· doxygen文档之九
· doevents应用
· dotnet总结(1)
· double值格式化输出的精度问题解决
· doxygen文档之六
· dom4j的jaxenexception 论述
· docmd.runsql 语句执行的操作查询如何回滚?
热点文章
%>
· creating user controls
· 提高fastreplace速度 (fstrrep.pas)
· asc ii 完整码表及简介
· 自动生成拼音(汉字反查到拼音)
· sql2000无法安装的解决办法
· 浏览器集成教学 自定义浏览器
· vc++技术内幕(第四版)笔记(第7章)
· mysql5.0中文乱码解决方案
· sql server日期计算
· vc下利用ado连接access数据库
 淘宝旺旺:我要购书网上书店『图书目录
本购书中心地址: 杭州市延安路111号清波商厦南楼D座(总部) 上海市闸北区老沪太路网上购书中心(沪部),  邮编:310002
电子邮件:books@51goushu.com  经营许可证编号:沪ICP备06038574号
版权所有 2003-2008 © All Rights Reserved .购书网