关于DOM
有人在优快云上问我,dom是什么?想来想去还是不好说,结果搜索到了这么多,都看看!还是有些启发!
**************************************
DOM概览
作者: 常明写作日期:2000-4-26
DOM是对XML开发者相当重要的,对于XML应用开发来说就是一个对象化的XML数据接口。最基本的XML开发通常都要使用它。简单说,DOM就是一组对象的集合,通过操纵这些对象,我们就能操纵XML和HTML数据。
DOM全称是Document Object Model,人如其名,DOM就是一个文档对象组成的模型,它不光用于XML,最先是起于HTML的。对作过Web开发的人,特别是写过动态DHTML的人,应该对HTML中的文档对象有一定概念,DOM就是这样一个对象模型的标准。
DOM另外又是一个接口,一个与语言无关的接口,应用通过这个接口来和XML或HTML内的数据打交道。无论是在浏览器里,还是在浏览器外,在服务器上,还是客户端,我们只要用XML就会碰到DOM。
1. DOM的来由
为什么要定义这样一个接口呢?这样讲吧,我们知道数据库有标准的ODBC/JDBC这样的接口规范,那么我们使用XML数据如果没有一个统一的接口,我们写程序是不是要每个人都要自己去处理XML的语法细节,如果我们手头有XML的语法分析器(有人译为解析器),它也必然有一个接口让我们通过它访问XML数据,所有语法分析器的接口如果都不相同,我们开发就必须针对某一个分析器,如果换了分析器,程序就必须重写。到这里,又和数据库有可比性了,我们编数据库应用可以不管后面的数据库系统究竟是ORACLE还是SYBASE,或INFORMIX,是因为有了ODBC,所以要是我们做XML应用开发,就应该有一个统一的XML数据接口,这个接口就是DOM。
2. DOM的三部分
目前的DOM分为核心(core)、HTML、XML三部分。
核心:
这部分是结构化文档比较底层的对象的集合,但他们就已经可以表达出任何HTML和XML文件了。
HTML和XML
这两部分是专为XML和HTML提供的另外的高级接口,使操纵者两类文件更方便。98年的只有HTML部分。
3.DOM组成
这里有Vance Christiaanse给出的DOM的一个整体的图,可以使大家有一个DOM模型基本组成的概念。要看此图请点这里(比较大哦)。
4 文件树
DOM中的最基本对象应该就是Node了。从它又派生出许多类型的node。所有这些node组成一棵文件树,它包含了XML或HTML文档的几乎全部信息。
在结构化文档中,信息是按层次化的树形结构组织的。所以结构化文档的模型的组织也必然是树形的。
如一本书的组成是
书----标题
|
---正文---第一章-----第一节---段
|
--第二章.....
Node简单的说,就是上面树形结构中的节点,但对XML来说还包括其他XML语法相关的节点,包括XML声明,文件类型声明,处理指令等等。
Node提供一些基本属性和操作,各种类型的Node则继承Node的属性和操作,同时有各自特殊的属性和操作。比如ElementNode
5 基本对象
上面已经讲了DOM中最基本的对象就是节点,它的接口定义如下:
从NODE派生出的几个比较重要的节点类型有Document Element, Attribute,Text:
Document是DOM树的根,它代表一个完整的XML文档。它会有一些自己的子节点,至少应该有一个文档元素的子节点,这个节点类型为Element,是XML文件最外层的根元素,此外他还可能有DocumentType(唯一),ProcessingInstruction,Comment这几种作为子节点。
Element代表XML元素,是最常用的节点,它可以组成以它为根的DOM的子树。他还可以有Element子节点,以及Attribut,Text,ProcessingInstruction,CDATASection,Comment子节点。
Attribute是XML元素的属性,它的父节点必然是Element,它的子节点有Text和EntityReference。
除了Node,DOM里还有两个比较重要的对象:
NodeList它实现的一个节点的序列,用于表示有顺序关系的一组节点,比如某个节点的孩子节点序列,它还出现在一些方法的返回值中,例如GetNodeByName。
NamedNodeMap它表示的是一组节点和其唯一的名字的对应关系,这个对象主要用在属性节点的表示上。
6 DOM的版本
目前的DOM level one是W3C1998年8月18日通过的,现在w3c正在进行DOM2的制定。
DOM2我们将在以后的文章中介绍。
7 编程
DOM 的具体使用和编程不是很难,现在DOM的实现主要是以部件的形式提供比如MSXML,和JAVA实现比如XML4J。这两种实现,对我们使用它的接口来说,大同小异,但许多实现都加了自己的扩展的接口,这也是我们选择时考虑比较多的。
DOM接口的具体的使用,我会在相关的文章中讨论。(完)
*****************************************************************
了解DOM
Document Object Model API可以增强你的解析能力。
by Dan Wahlin
.NET平台提供了许多不同的方法来运用XML。因为这个原因,人们并不是很清楚地知道读取和操作XML文件的最好的方法是什么。如果你对XML或.NET平台不是很熟悉,情况尤其如此。在本文中,我将介绍一种运用DOM(Document Object Model)API(应用编程接口)的解析方法。
什么是DOM?
DOM通过把一个XML文件载入内存而起作用。结果就是一个可以解析和编辑的显示在内存中的文件。文件中不同节点间的关系都保持不变,因此你可以认为它很类似于一个家谱图,带有父/子分等级的关系。
作为例子,下面这个表示高尔夫球手信息的XML文件,一旦载入内存可能看上去就是像图1中显示的那样:
<golfer>
<name>Dan Wahlin</name>
<courses>
<course>Pinetop Lakes
CC</course>
<course>Ocotillo</course>
</courses>
</golfer>
图1. XML节点关系的例子
在载入内存后,DOM API可以让你沿着任意方向在XML文件中导航,并提供了全部的编辑功能,你可以编辑、删除、插入和移动节点。

图1. XML节点关系的例子
该图描述了DOM如何把一个XML文件载入内存中,并保持不同节点间的等级关系。
我该如何运用DOM API?
用来在内存中加载和操作XML文件的DOM类位于.NET平台中的System.Xml名字空间。你可能经常用到的一些主要的类如下: · XmlDocument
· XmlNode
· XmlNodeList
· XmlNamedNodeMap
· XmlElement
· XmlAttribute
还有许多其它的类,但上面的类是基本的“积木块”(building blocks)。
XmlDocument类可以用来把一个XML文件载入内存,然后读取文件的“根”元素。XML可以存在一个静态的文件中,可以从一个字节串读取,从诸如XmlTextReader的另一个.NET对象中读取,或者从一个字符串读取。例如,当从一个文件读取时,你可以调用XmlDocument的Load()方法,如下所示:string xmlPath =
Server.MapPath("golfer.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
如果你想把包含在一个字符串中的XML载入DOM,那么你可以运用LoadXml()方法:string xmlDocString =
"<root><child>SomeText</c
hild></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlDocString);
在将你想要的XML文件载入内存后,你就可以遍历XML,读取或编辑不同的节点。在列表1中显示了一个例子,你可以用DOM来添加一个新的<course>元素到前面所示的XML文件。
运行该代码所形成的XML文件如下:<golfer>
<name>Dan Wahlin</name>
<courses>
<course>Pinetop Lakes
CC</course>
<course>Ocotillo</course>
<course>TPC
Sawgrass</course>
</courses>
</golfer>
虽然这是个相当简单的例子,但你也可以用DOM来添加或删除属性,实际上,你可以操作一个XML文件中可以出现的任何类型的节点。有时候,你可能只是想用DOM来读一个XML文件,这时,你就可以灵活地从多个方向来遍历(例如,从父元素到子元素,反之亦然)。在http://www.xmlforasp.net/codeSection.aspx?csID=19,你可以看到一个更复杂的例子,它用DOM来遍历一个XML文件来为浏览器形成一个分等级的菜单结构。
我什么时候应该运用DOM?
在本文的开始,我提到了在.NET平台中有几种不同的方法来解析XML。有些方法更快更有效。虽然DOM并没有提供最佳性能,但它的确提供了最好的方法在.NET平台中编辑XML文件,可以让你灵活地从任何方向遍历内存中的XML文件。因此,当你需要编辑XML时,你应该选择运用DOM。
虽然DOM API很容易使用,但你应该注意不要把它用在不适合的情况中。例如,如果你需要读取XML但不需要编辑它,那么运用XmlTestReader类就可以提供最佳性能,它是个只向前的(forward-only) API。如果你需要读取XML,也需要从任何方向遍历XML树形结构,你可以考虑XpathNavigator API,因为它提供了一种“不可编辑的”DOM。当你决定运用DOM API时,问问你自己“我真的想把整个XML文件加载到内存中吗?”这一步很重要,尤其当你需要处理大的XML文件的时候。
总结
DOM提供了一个强大的、易于使用的、基于内存的API,它可以用来解析和编辑XML文件。通过学习System.Xml集合中的不同的DOM类,你就可以在你的.NET应用程序中完成强大的与XML相关的任务。
更多关于运用DOM的例子,你可以参见XML for ASP.NET Developers site。
有人在优快云上问我,dom是什么?想来想去还是不好说,结果搜索到了这么多,都看看!还是有些启发!
**************************************
DOM概览
作者: 常明写作日期:2000-4-26
DOM是对XML开发者相当重要的,对于XML应用开发来说就是一个对象化的XML数据接口。最基本的XML开发通常都要使用它。简单说,DOM就是一组对象的集合,通过操纵这些对象,我们就能操纵XML和HTML数据。
DOM全称是Document Object Model,人如其名,DOM就是一个文档对象组成的模型,它不光用于XML,最先是起于HTML的。对作过Web开发的人,特别是写过动态DHTML的人,应该对HTML中的文档对象有一定概念,DOM就是这样一个对象模型的标准。
DOM另外又是一个接口,一个与语言无关的接口,应用通过这个接口来和XML或HTML内的数据打交道。无论是在浏览器里,还是在浏览器外,在服务器上,还是客户端,我们只要用XML就会碰到DOM。
1. DOM的来由
为什么要定义这样一个接口呢?这样讲吧,我们知道数据库有标准的ODBC/JDBC这样的接口规范,那么我们使用XML数据如果没有一个统一的接口,我们写程序是不是要每个人都要自己去处理XML的语法细节,如果我们手头有XML的语法分析器(有人译为解析器),它也必然有一个接口让我们通过它访问XML数据,所有语法分析器的接口如果都不相同,我们开发就必须针对某一个分析器,如果换了分析器,程序就必须重写。到这里,又和数据库有可比性了,我们编数据库应用可以不管后面的数据库系统究竟是ORACLE还是SYBASE,或INFORMIX,是因为有了ODBC,所以要是我们做XML应用开发,就应该有一个统一的XML数据接口,这个接口就是DOM。
2. DOM的三部分
目前的DOM分为核心(core)、HTML、XML三部分。
核心:
这部分是结构化文档比较底层的对象的集合,但他们就已经可以表达出任何HTML和XML文件了。
HTML和XML
这两部分是专为XML和HTML提供的另外的高级接口,使操纵者两类文件更方便。98年的只有HTML部分。
3.DOM组成
这里有Vance Christiaanse给出的DOM的一个整体的图,可以使大家有一个DOM模型基本组成的概念。要看此图请点这里(比较大哦)。
4 文件树
DOM中的最基本对象应该就是Node了。从它又派生出许多类型的node。所有这些node组成一棵文件树,它包含了XML或HTML文档的几乎全部信息。
在结构化文档中,信息是按层次化的树形结构组织的。所以结构化文档的模型的组织也必然是树形的。
如一本书的组成是
书----标题
|
---正文---第一章-----第一节---段
|
--第二章.....
Node简单的说,就是上面树形结构中的节点,但对XML来说还包括其他XML语法相关的节点,包括XML声明,文件类型声明,处理指令等等。
Node提供一些基本属性和操作,各种类型的Node则继承Node的属性和操作,同时有各自特殊的属性和操作。比如ElementNode
5 基本对象
上面已经讲了DOM中最基本的对象就是节点,它的接口定义如下:
从NODE派生出的几个比较重要的节点类型有Document Element, Attribute,Text:
Document是DOM树的根,它代表一个完整的XML文档。它会有一些自己的子节点,至少应该有一个文档元素的子节点,这个节点类型为Element,是XML文件最外层的根元素,此外他还可能有DocumentType(唯一),ProcessingInstruction,Comment这几种作为子节点。
Element代表XML元素,是最常用的节点,它可以组成以它为根的DOM的子树。他还可以有Element子节点,以及Attribut,Text,ProcessingInstruction,CDATASection,Comment子节点。
Attribute是XML元素的属性,它的父节点必然是Element,它的子节点有Text和EntityReference。
除了Node,DOM里还有两个比较重要的对象:
NodeList它实现的一个节点的序列,用于表示有顺序关系的一组节点,比如某个节点的孩子节点序列,它还出现在一些方法的返回值中,例如GetNodeByName。
NamedNodeMap它表示的是一组节点和其唯一的名字的对应关系,这个对象主要用在属性节点的表示上。
6 DOM的版本
目前的DOM level one是W3C1998年8月18日通过的,现在w3c正在进行DOM2的制定。
DOM2我们将在以后的文章中介绍。
7 编程
DOM 的具体使用和编程不是很难,现在DOM的实现主要是以部件的形式提供比如MSXML,和JAVA实现比如XML4J。这两种实现,对我们使用它的接口来说,大同小异,但许多实现都加了自己的扩展的接口,这也是我们选择时考虑比较多的。
DOM接口的具体的使用,我会在相关的文章中讨论。(完)
*****************************************************************
了解DOM
Document Object Model API可以增强你的解析能力。
by Dan Wahlin
.NET平台提供了许多不同的方法来运用XML。因为这个原因,人们并不是很清楚地知道读取和操作XML文件的最好的方法是什么。如果你对XML或.NET平台不是很熟悉,情况尤其如此。在本文中,我将介绍一种运用DOM(Document Object Model)API(应用编程接口)的解析方法。
什么是DOM?
DOM通过把一个XML文件载入内存而起作用。结果就是一个可以解析和编辑的显示在内存中的文件。文件中不同节点间的关系都保持不变,因此你可以认为它很类似于一个家谱图,带有父/子分等级的关系。
作为例子,下面这个表示高尔夫球手信息的XML文件,一旦载入内存可能看上去就是像图1中显示的那样:
<golfer>
<name>Dan Wahlin</name>
<courses>
<course>Pinetop Lakes
CC</course>
<course>Ocotillo</course>
</courses>
</golfer>
图1. XML节点关系的例子
在载入内存后,DOM API可以让你沿着任意方向在XML文件中导航,并提供了全部的编辑功能,你可以编辑、删除、插入和移动节点。

图1. XML节点关系的例子
该图描述了DOM如何把一个XML文件载入内存中,并保持不同节点间的等级关系。
我该如何运用DOM API?
用来在内存中加载和操作XML文件的DOM类位于.NET平台中的System.Xml名字空间。你可能经常用到的一些主要的类如下: · XmlDocument
· XmlNode
· XmlNodeList
· XmlNamedNodeMap
· XmlElement
· XmlAttribute
还有许多其它的类,但上面的类是基本的“积木块”(building blocks)。
XmlDocument类可以用来把一个XML文件载入内存,然后读取文件的“根”元素。XML可以存在一个静态的文件中,可以从一个字节串读取,从诸如XmlTextReader的另一个.NET对象中读取,或者从一个字符串读取。例如,当从一个文件读取时,你可以调用XmlDocument的Load()方法,如下所示:string xmlPath =
Server.MapPath("golfer.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
如果你想把包含在一个字符串中的XML载入DOM,那么你可以运用LoadXml()方法:string xmlDocString =
"<root><child>SomeText</c
hild></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlDocString);
在将你想要的XML文件载入内存后,你就可以遍历XML,读取或编辑不同的节点。在列表1中显示了一个例子,你可以用DOM来添加一个新的<course>元素到前面所示的XML文件。
运行该代码所形成的XML文件如下:<golfer>
<name>Dan Wahlin</name>
<courses>
<course>Pinetop Lakes
CC</course>
<course>Ocotillo</course>
<course>TPC
Sawgrass</course>
</courses>
</golfer>
虽然这是个相当简单的例子,但你也可以用DOM来添加或删除属性,实际上,你可以操作一个XML文件中可以出现的任何类型的节点。有时候,你可能只是想用DOM来读一个XML文件,这时,你就可以灵活地从多个方向来遍历(例如,从父元素到子元素,反之亦然)。在http://www.xmlforasp.net/codeSection.aspx?csID=19,你可以看到一个更复杂的例子,它用DOM来遍历一个XML文件来为浏览器形成一个分等级的菜单结构。
我什么时候应该运用DOM?
在本文的开始,我提到了在.NET平台中有几种不同的方法来解析XML。有些方法更快更有效。虽然DOM并没有提供最佳性能,但它的确提供了最好的方法在.NET平台中编辑XML文件,可以让你灵活地从任何方向遍历内存中的XML文件。因此,当你需要编辑XML时,你应该选择运用DOM。
虽然DOM API很容易使用,但你应该注意不要把它用在不适合的情况中。例如,如果你需要读取XML但不需要编辑它,那么运用XmlTestReader类就可以提供最佳性能,它是个只向前的(forward-only) API。如果你需要读取XML,也需要从任何方向遍历XML树形结构,你可以考虑XpathNavigator API,因为它提供了一种“不可编辑的”DOM。当你决定运用DOM API时,问问你自己“我真的想把整个XML文件加载到内存中吗?”这一步很重要,尤其当你需要处理大的XML文件的时候。
总结
DOM提供了一个强大的、易于使用的、基于内存的API,它可以用来解析和编辑XML文件。通过学习System.Xml集合中的不同的DOM类,你就可以在你的.NET应用程序中完成强大的与XML相关的任务。
更多关于运用DOM的例子,你可以参见XML for ASP.NET Developers site。