`

DOM Node Element Attr 的联系与区别汇总

    博客分类:
  • XML
阅读更多

node有几个子类型:Element, Text, Attribute, RootElement, Comment, Namespace等

Element是可以有属性和子节点的node。 

---------------------------------------------------------

node和Element是两个领域的概念。

NODE是相对TREE这种数据结构而言的。TREE就是由NODE组成。这个部分你可以参考离散数学的树图。

ELEMENT则是XML里的概念,<xxx>就是元素,是XML中的数据的组成部分之一。

之所以会ELEMENT和NODE会有概念上的重叠,是因为XML采用的是TREE的结构,因此你只要明白TREE的概念就明白它们的区别了。

最后,在强调一下,严格意义上说,它们是2个不同领域的概念。 

 

---------------------------------------------------------

 

DOM(文档对象模型)是对XML数据的描述体系,它用树型结构的文档来保存XML数据。此外,DOM也包括了解析、处理XML数据的API。

在开始使用DOM之前,首先来了解一下它的结构。DOM整体上的结构是一个Composite模式。所有的XML单元,无论是文档、元素还是属性、文本,在DOM中都是一个Node(节点)。按照Composite模式的定义,每个Node都可以包容其他的Node,于是很轻松地就构成了一个树型结构。

-------------------------------------------------

xml中Node和Element的区别 :

 

元素(Element)和结点(Node)的区别,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>。但是一个结点不一定是一个元素,而一个元素一定是一个结点。

---------------------------------------------------------

 

Attr 接口表示 

Element

 对象中的属性。通常该属性所允许的值定义在与文档相关的模式中。

 

---------------------------------------------------------

一、什么是DOM

DOM是Document Object Model的缩写,是对XML文档的内容进行表示的模型。它把XML文档看作是一系列node和node间的关系,并且把每一个node都当作一个对象,所以叫文档对象模型。

DOM规范是W3C定义的,有三个Level:

l         Level 1: 定义了绝大多数基础功能

l         Level 2: 增加定义了namespace

l         Level 3: 对各个特性有了更好的支持

DOM是与编程语言无关的,因此有多种实现,这里的都是用Java的API(其他的我也不会),用的是Sun定义的标准JAXP(Java API for XML Parsing),而JAXP仅仅是一个接口,它是调用其他的具体解析器来实现的。此外不是用JAXP的DOM实现还有JDOM和DOM4J。

DOM将文档中的所有都看作节点,因此定义了一个最基础的接口是Node,它的字接口包括Element,Attr,Text等等,还包括了Document,也就是说DOM将整个文档看作是一个节点。在Node中定义了很多方法,包括了读取节点(getFirstChild(), getNextSibling(), getLastNode(), getChildNodes(), getNodeName(), getNodeType(), getNodeValue(), getParentNode(), getAttributes(), getOwnerDocuemt())、修改节点(insertBefore(), removeChild(), appendChild(), replaceChild(), setNodeValue()),这些方法都非常常用,但是没有定义创建节点的方法,创建节点的方法是在它的子接口Document中定义的(createXXX()),也没有定义按节点名字来得到节点的方法,这些方法是在Element和Document中定义的(getElementById(), getElementByTagName(), 注意在这里按照名字直接得到的是Element)。

DOM在解析文档的时候按整个文档的结构生成一棵树,全部保存在内存中,这既产生了一些优点,也产生了一些缺点。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。

一个需要注意的地方就是,XML文档两个标签之间的空白也是这棵树的一个节点(Text节点)。

 

二、DOM的API

1、创建Document

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse("abc.xml");

创建一个文档的过程是非常固定的,三步走。在这里DocumentBuilderFactory有一些方法可以对我们的解析进行一定的控制,比如是否必须经过DTD或Schema验证有效,是否忽略注释,是否忽略namespace等等:

factory.setValidating(true);

factory.setIgnoringComments(true);

factory.setNamespaceAware(true);

2、浏览XML文档的内容

获得Document后的第一步就是获得root element,也叫document element:

Element root = doc.getDocumentElement();

这是Document最常用的方法之一,然而事实上直接调用getFirstChild()也可以得到。获得根节点后就可以用各种各样的getXXX()方法来进行浏览。有一个重要的问题是Attr不属于任何节点的子节点,因此用getFirstChild(),getNextSibling(),getChildNodes()是无法得到它的,必须用专用的方法getAttributes(),getAttribute(String)单独处理。

3、修改XML文档

修改包含两方面的内容,一方面是修改已有的,另一方面是创建新的节点加入到文档中去。

修改已有的节点值,只需要浏览到目标节点,然后调用Node.setNodeValue()就可以了,对Attr来说则是调用setValue();而修改已有的节点,则用replaceChild();删除一个节点用removeChild()。

创建新节点时,正如前面所说,是用Document来创建的。创建好后就可以使用append()或insertBefore()来插入到合适的地方。此外Attr总是比较特殊,为一个元素添加属性需要用setAttribute()方法,而删除属性则要用removeAttribute()方法。

4、返回值NodeList和NamedNodeMap

在get方法中,有些方法返回一个节点列表,最多的是NodeList,而getAttributes()返回的是NamedNodeMap,幸好两者完全像一个List,访问的方法都是item(int index)。

5、输出XML文档

前面的修改xml文档只是在内存中修改了这棵树,并没有真正影响磁盘上的文件。要真正输出到磁盘上,事实上和DOM没什么关系,而是用FileWriter或FileOutputStream输出文档为一个文件而已。然而有一点需要注意的是,在调用FileWriter.write()时,写的不是Document对象,而是根元素对象:

writer.write(root);

此外通常需要创建一个新的xml文档,DocumentBuilder的另一个方法是newDocument()可以创建一个新的文档,然后自然可以创建一系列的节点,并联结起来,形成一个完整的文档,最后输出。

有一点值得奇怪的是,通常我们会需要在读入一个文档后,进行了浏览,做了一些修改,然后想要把这些修改也写回到

分享到:
评论

相关推荐

    XML DOM技术的设计

    各节点的实例,包括element节点 、Text节点、 Attr节点 、 DocumentType节点、 处理空白、验证规范性和有效性。用DOM生成XML文件,包括Transformer对象;用于修改Document的常用方法 ;用DOM建立XML文件等内容。 ...

    文档对象模型(DOM)的帮助文档

    DOM 的基本对象有5个:Document ,Node ,NodeList ,Element 和Attr 。本文档主要描述了这5个文档的主要方法的使用。

    Android应用中使用DOM方式解析XML格式数据的基本方法

    node – DOM基本的数据类型 Element – 最主要处理的对象是Element Attr – 元素的属性 Text – 一个Element 或者Attr的实际内容 Document – 代表整个XML文档,一个Document对象通常也称为一颗DOM树   1.在src目录...

    dom-binder:DOM 绑定器

    dom-binder DOM 绑定器安装$ component install alexeyraspopov/dom-binder$ bower install dom-binder应用程序接口 bind(node, attr, observer)observer应该提供方法subscribe ,它传递一个函数并立即用最新的值...

    javascript DOM 操作基础知识小结

    DOM添加元素,使用节点属性 DOM添加元素,使用节点属性 Item 1 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]一、DOM基础1.节点(node)层次Document--最顶层的节点,所有的其他节点都是附属于它的。...

    比较详细的javascript DOM 学习笔记第1/2页

    一、DOM基础1.节点(node)层次Document--最顶层的节点,所有的其他节点都是附属于它的。DocumentType--DTD引用(使用&lt;!DOCTYPE&gt;语法)的对象表现形式,它不能包含子节点。DocumentFragment--可以像Document...

    android xml文件操作

    if (((Node) node).getNodeType() == Node.ELEMENT_NODE) { result = ((Element) node).getAttribute(attrName); } else { // 遍历整个xml某节点指定的属性 NamedNodeMap attrs = ((Node) node)....

    day023-xml解析笔记和代码.rar

    Attribute(属性) - Attr Text(文本) dom4j解析: 支持xpath解析,就可以可以直接输入一个路径查找: 由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, ...

    JavaScript权威指南

    Element Positioning with CSS Section 18.3. Scripting Styles Section 18.4. DHTML in Fourth-Generation Browsers Section 18.5. Other DOM APIs for Styles and Style Sheets Chapter 19. Events and...

    javascript完全学习手册2 源码

    6.3.4 Text接口和Attr接口 6.4 操作HTML文档 6.4.1 访问元素 6.4..2 添加节点 6.4.3 删除节点 6.4.4 对属性进行操作 第3篇 JavaScript高级编程篇 第7章 正则表达式 7.1 正则表达式及其作用 7.2 正则...

    javascript完全学习手册1 源码

    6.3.4 Text接口和Attr接口 136 6.4 操作HTML文档 138 6.4.1 访问元素 138 6.4.2 添加节点 140 6.4.3 删除节点 142 6.4.4 对属性进行操作 146 第3篇 JavaScript高级编程篇 第7章 正则表达式 151 7.1 正则表达式及其...

    JavaScript Table行定位效果

    上面用到了parentNode,这里顺便说说它跟offsetParent,parentElement的区别。 先看看parentNode在w3c的说明: The parent of this node. All nodes, except Document, DocumentFragment, and Attr may have a ...

    IXML_Programming_Guide

    4.1 Interface Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.2 Interface Attr . . . . . . . . . . . . . . . ...

    python3.6.5参考手册 chm

    Updated module: ElementTree 1.3 Build and C API Changes Capsules Port-Specific Changes: Windows Port-Specific Changes: Mac OS X Port-Specific Changes: FreeBSD Other Changes and Fixes Porting to ...

    jquery插件使用方法大全

    ·attribute(改进了.attr()的性能)、jQuery()核心函数、CSS(.css()性能有两倍提升)、特效和事件、DOM操作等也有显著改进 1.5 美国时间1月31日John Resig在jQuery官方博客发表文章,宣布jQuery 1.5正式版已经...

Global site tag (gtag.js) - Google Analytics