`

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()可以创建一个新的文档,然后自然可以创建一系列的节点,并联结起来,形成一个完整的文档,最后输出。

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

分享到:
评论

相关推荐

    java解析XML Node与Element的区别(推荐)

    在Java中,解析XML文档时,常常会遇到Node和Element这两个概念,它们是XML DOM(文档对象模型)中两个核心的接口,分别代表了XML文档的不同层级和类型。理解它们的区别对于有效地操作XML至关重要。 首先,Node是...

    最新Dom4j 与 dom4j英文版API

    XPath xpath = XPathFactory.instance().compile("/root/element[@attr='value']"); NodeList list = xpath.selectNodes(document); for (Node node : list) { // 处理匹配的节点 } ``` **4. Dom4j与JAXB、JDOM...

    dom4j-1.6.1和API

    - **Attribute(属性)**: 表示 XML 元素的属性,例如 `&lt;element attr="value"&gt;` 中的 `attr="value"`。 - **Document(文档)**: 整个 XML 文档的根对象,包含了 XML 文档的结构。 - **Namespace(命名空间)**: ...

    dom4j使用教程+dom4j.jar

    List&lt;Element&gt; elements = (List&lt;Element&gt;) xpath.evaluate("//elementName", document, XPathConstants.NODESET); ``` 2. **选择器API**: DOM4J还提供了基于Java 8 Stream API的选择器,可以更方便地筛选和操作...

    dom4j 工具类

    DOM4J常用于XML配置文件的读写、XML数据的解析与构建、XML与Java对象之间的映射等场景。例如,Spring框架就大量使用DOM4J处理配置文件。 总的来说,DOM4J作为一款强大的XML处理库,为开发者提供了丰富的功能和便捷...

    DOM4J使用详解

    - `Attribute`:表示XML文档中的属性,例如元素的属性 `&lt;element attr="value"/&gt;` 中的`attr`。 - `Branch`:表示可以包含子节点的节点,如元素(`Element`)和文档(`Document`)。 - `CDATA`:表示XML的CDATA...

    DOM常用属性和方法

    #### 三、DOM中的关键属性与方法 DOM提供了多种方法来帮助开发者创建、检索、修改或删除文档中的节点。以下是一些常用的DOM方法和属性: ##### Document对象的关键方法 - **createAttribute(name)**: 创建一个新...

    Dom4j 解析Xml文档及 XPath查询 学习笔记

    Element element = (Element) node; // 处理查询到的元素 } ``` 3. **XPath表达式**:XPath表达式可以包含元素选择、属性选择、文本选择等多种操作,如`//element`匹配所有`element`元素,`@attr`匹配属性,`[条件...

    dom4j从基础到精通

    umentElement定义了 XML 元素NodeNode 是所有 XML 节点的根接口ProcessingInstruction处理指令,用于向处理器发送指令Text定义了 XML 文本的行为XPathXPath 提供了强大的查询 XML 文档的能力 二、使用 dom4j 创建 ...

    HTML DOM 常用的属性和方法

    6. AttrNode.ATTRIBUTE_NODE(2):表示元素的属性节点。 DOM对象提供了一系列方法来操作这些节点: 1. `createAttribute(name)`:创建一个新的属性节点。 2. `createComment(text)`:创建一个新的注释节点。 3. `...

    XML DOM4J学习笔记

    五、DOM4J序列化与反序列化 1. 序列化XML:`OutputFormat format = OutputFormat.createPrettyPrint();`设置格式,`XMLWriter writer = new XMLWriter(new FileWriter("output.xml"), format);`,然后`writer.write...

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

    DOM 的基本对象包括五个核心组件:`Document`、`Node`、`NodeList`、`Element` 和 `Attr`。每个对象都有其特定的功能和用途。 ##### Document 对象 - **定义**:`Document` 对象表示整个 XML 文档。 - **用途**:...

    ASP DOM生成XML

    newNode2.setAttributeNode(attrNode) ``` - 使用`CreateAttribute`方法创建一个属性节点,并设置其值。然后通过`setAttributeNode`方法将属性添加到元素节点上。 7. **保存XML文档:** ```vb xmldoc.save...

    Dom4j的使用(全而好的文章)

    解析XML后,可以通过`Element`、`Node`接口及其子类访问和遍历XML结构。例如,遍历根元素的所有子节点: ```java Element root = document.getRootElement(); for (Object child : root.content()) { Node node...

    java解析XML dom4j dom4j-1.6.1.jar

    Node node = document.selectSingleNode("//element"); ``` 8. **序列化XML** - `Document`的`asXML()`方法将XML文档转换为字符串。 - `Document`的`write()`方法将XML写入文件。 9. **实际操作实例** 创建一...

    文档对象模型(DOM)

    - `nodeType`常量标识不同的节点类型,如ElementNode(1)、TextNode(3)、DocumentNode(9)、CommentNode(8)和DocumentFragmentNode(11)等。 - `Document`对象是树的根,`documentElement`属性指向文档的根...

    DOM4j属性的详细介绍及相关的例子

    1. **Attribute接口**:该接口代表XML文档中的属性,比如`&lt;element attr="value"/&gt;`中的`attr="value"`部分。通过`Attribute`接口,你可以获取和设置属性的名称和值。 2. **Branch接口**:`Branch`接口是那些可以...

    一写小例子,dom4J,dom,jdom,sax解析和创建XML文件,代码虽然简单,但是功能实现,适合入门

    与DOM4J类似,JDOM也支持XPath查询。 ```java import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter...

    dom4j解析xml文件的例子

    newElement.addAttribute("attr", "value"); ``` 这个例子中提到的“ExcelToXml”可能是指将Excel文件转换为XML的过程。这通常涉及读取Excel文件,然后用DOM4J或其他库将数据结构化为XML。Apache POI是一个常用的...

Global site tag (gtag.js) - Google Analytics