频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Java 利用DOM和SAX解析XML
2017-03-30 09:14:00         来源:venus14的博客  
收藏   我要投稿

Java 利用DOM和SAX解析XML

DOM解析

在DOM接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Document,Element,Attribute,Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。

1.Document

Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。

2.NodeList

NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如getElementsByTagName。

在DOM中,NodeList的对象是"live"的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM应用程序再做其他额外的操作。

NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。

3.NamedNodeMap

实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意,NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。

NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。与NodeList相同,在DOM中,NamedNodeMap对象也是"live"的。

4.Dom对象

一切都是节点(对象)

.Node对象:DOM结构中最为基本的对象

?Document对象:代表整个XML的文档

?NodeList对象:包含一个或者多个Node的列表

?Element对象:代表XML文档中的标签元素

5.dom解析xml步骤

\

  1. importjavax.xml.parsers.*;
  2. importorg.w3c.dom.*;
  3. publicclassdom{
  4. publicstaticvoidmain(Stringargs[]){
  5. try{
  6. //建立解析器工厂
  7. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  8. //获得解析器
  9. DocumentBuilderbuilder=factory.newDocumentBuilder();
  10. Documentdoc=builder.parse("candidate.xml");
  11. NodeListnl=doc.getElementsByTagName("PERSON");
  12. for(inti=0;iElementnode=(Element)nl.item(i);
  13. System.out.print("NAME:");
  14. System.out.println(node.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue());
  15. ……
  16. System.out.println();
  17. }
  18. }catch(Exceptione){e.printStackTrace();}
  19. }
  20. }
    import javax.xml.parsers.*; 
    
    import org.w3c.dom.*; 
    
    public class dom { 
    
    public static void main(String args[]){ 
    
    try{ 
    
    //建立解析器工厂
    
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    
    //获得解析器
    
    DocumentBuilder builder=factory.newDocumentBuilder(); 
    
    Document doc=builder.parse("candidate.xml"); 
    
    NodeList nl =doc.getElementsByTagName("PERSON"); 
    
    for (int i=0;i

    程序详解:

    1)DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();

    ?我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

    2)?DocumentBuilderdb=dbf.newDocumentBuilder();

    ?当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要

    3)然后,我们就可以利用这个解析器来对XML文档进行解析了

    ?Documentdoc=db.parse("c:/xml/message.xml");

    ?DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了

    4).从上面得到的Document对象开始,我们就可以开始我们的DOM解析了。使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,所代表的是一个Node对象的列表

    NodeListnl=doc.getElementsByTagName("message");?我们通过这样一条语句所得到的是XML文档中所有标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象

    ?Nodemy_node=nl.item(0);

    5).当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法

    ?Stringmessage

    =my_node.getFirstChild().getNodeValue();

    注意:请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirstChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。

点击复制链接 与好友分享!回本站首页
上一篇:Java之Socket
下一篇:用java实现AES(二)
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站