道高一尺魔高一丈 电影:文档对象模型(DOM

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 05:36:38
一、什么是DOM
DOM是Document ObjectModel的缩写,是对XML文档的内容进行表示的模型。它把XML文档看作是一系列node和node间的关系,并且把每一个node都当作一个对象,所以叫文档对象模型。
DOM规范是W3C定义的,有三个Level:
       Level 1: 定义了绝大多数基础功能
       Level 2: 增加定义了namespace
       Level 3: 对各个特性有了更好的支持
DOM是与编程语言无关的,因此有多种实现,这里的都是用Java的API(其他的我也不会),用的是Sun定义的标准JAXP(JavaAPI for XMLParsing),而JAXP仅仅是一个接口,它是调用其他的具体解析器来实现的。此外不是用JAXP的DOM实现还有JDOM和DOM4J。
DOM将文档中的所有都看作节点,因此定义了一个最基础的接口是Node,它的字接口包括Element,Attr,Text等等,还包括了Document,也就是说DOM将整个文档看作是一个节点。在Node中定义了很多方法,包括了读取节点(getFirstChild(),getNextSibling(), getLastNode(), getChildNodes(), getNodeName(),getNodeType(), getNodue(), getParentNode(), getAttributes(),getOwnerDocuemt())、修改节点(insertBefore(), removeChild(),appendChild(), replaceChild(),setNodue()),这些方法都非常常用,但是没有定义创建节点的方法,创建节点的方法是在它的子接口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.setNodue()就可以了,对Attr来说则是调用setValue();而修改已有的节点,则用replaceChild();删除一个节点用removeChild()。
创建新节点时,正如前面所说,是用Document来创建的。创建好后就可以使用append()或insertBefore()来插入到合适的地方。此外Attr总是比较特殊,为一个元素添加属性需要用setAttribute()方法,而删除属性则要用removeAttribute()方法。
4、返回值NodeList和NamedNodeMap
在get方法中,有些方法返回一个节点列表,最多的是NodeList,而getAttributes()返回的是NamedNodeMap,幸好两者完全像一个List,访问的方法都是item(intindex)。
5、输出XML文档
前面的修改xml文档只是在内存中修改了这棵树,并没有真正影响磁盘上的文件。要真正输出到磁盘上,事实上和DOM没什么关系,而是用FileWriter或FileOutputStream输出文档为一个文件而已。然而有一点需要注意的是,在调用FileWriter.write()时,写的不是Document对象,而是根元素对象:
writer.write(root);
此外通常需要创建一个新的xml文档,DocumentBuilder的另一个方法是newDocument()可以创建一个新的文档,然后自然可以创建一系列的节点,并联结起来,形成一个完整的文档,最后输出。
有一点值得奇怪的是,通常我们会需要在读入一个文档后,进行了浏览,做了一些修改,然后想要把这些修改也写回到磁盘上,但是却没有直接写回原文档的方法,只能是使之输出到一个同名文档,覆盖了原来的