服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java与xml联合编程之dom篇(1)

dom初步
 
dom是document object model的缩写,即文档对象模型。前面说过,xml将数据组织为一颗树,所以dom就是对这颗树的一个对象描叙。通俗的说,就是通过解析xml文档,为xml文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取xml文档的内容。

下面我们来看一个简单的例子,看看在dom中,我们是如何来操作一个xml文档的。

这是一个xml文档,也是我们要操作的对象:



good-bye serialization, hello java!


下面,我们需要把这个文档的内容解析到一个个的java对象中去供程序使用,利用jaxp,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

documentbuilderfactory dbf = documentbuilderfactory.newinstance();

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

documentbuilder db = dbf.newdocumentbuilder();

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

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

document doc = db.parse("c:/xml/message.xml");

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

jaxp支持w3c所推荐的dom 2。如果你对dom很熟悉,那么下面的内容就很简单了:只需要按照dom的规范来进行方法调用就可以。当然,如果你对dom不清楚,也不用着急,后面我们会有详细的介绍。在这儿,你所要知道并牢记的是:dom是用来描叙xml文档中的数据的模型,引入dom的全部原因就是为了用这个模型来操作xml文档的中的数据。dom规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取xml的数据。

从上面得到的document对象开始,我们就可以开始我们的dom之旅了。使用document对象的getelementsbytagname()方法,我们可以得到一个nodelist对象,一个node对象代表了一个xml文档中的一个标签元素,而nodelist对象,观其名而知其意,所代表的是一个node对象的列表:

nodelist nl = doc.getelementsbytagname("message");

我们通过这样一条语句所得到的是xml文档中所有标签对应的node对象的一个列表。然后,我们可以使用nodelist对象的item()方法来得到列表中的每一个node对象:

node my_node = nl.item(0);

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

string message = my_node.getfirstchild().getnodevalue();

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

现在,既然我们已经能够从xml文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。
dom初步
 
dom是document object model的缩写,即文档对象模型。前面说过,xml将数据组织为一颗树,所以dom就是对这颗树的一个对象描叙。通俗的说,就是通过解析xml文档,为xml文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取xml文档的内容。

下面我们来看一个简单的例子,看看在dom中,我们是如何来操作一个xml文档的。

这是一个xml文档,也是我们要操作的对象:



good-bye serialization, hello java!


下面,我们需要把这个文档的内容解析到一个个的java对象中去供程序使用,利用jaxp,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

documentbuilderfactory dbf = documentbuilderfactory.newinstance();

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

documentbuilder db = dbf.newdocumentbuilder();

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

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

document doc = db.parse("c:/xml/message.xml");

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

jaxp支持w3c所推荐的dom 2。如果你对dom很熟悉,那么下面的内容就很简单了:只需要按照dom的规范来进行方法调用就可以。当然,如果你对dom不清楚,也不用着急,后面我们会有详细的介绍。在这儿,你所要知道并牢记的是:dom是用来描叙xml文档中的数据的模型,引入dom的全部原因就是为了用这个模型来操作xml文档的中的数据。dom规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取xml的数据。

从上面得到的document对象开始,我们就可以开始我们的dom之旅了。使用document对象的getelementsbytagname()方法,我们可以得到一个nodelist对象,一个node对象代表了一个xml文档中的一个标签元素,而nodelist对象,观其名而知其意,所代表的是一个node对象的列表:

nodelist nl = doc.getelementsbytagname("message");

我们通过这样一条语句所得到的是xml文档中所有标签对应的node对象的一个列表。然后,我们可以使用nodelist对象的item()方法来得到列表中的每一个node对象:

node my_node = nl.item(0);

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

string message = my_node.getfirstchild().getnodevalue();

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

现在,既然我们已经能够从xml文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。
dom初步
 
dom是document object model的缩写,即文档对象模型。前面说过,xml将数据组织为一颗树,所以dom就是对这颗树的一个对象描叙。通俗的说,就是通过解析xml文档,为xml文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取xml文档的内容。

下面我们来看一个简单的例子,看看在dom中,我们是如何来操作一个xml文档的。

这是一个xml文档,也是我们要操作的对象:



good-bye serialization, hello java!


下面,我们需要把这个文档的内容解析到一个个的java对象中去供程序使用,利用jaxp,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

documentbuilderfactory dbf = documentbuilderfactory.newinstance();

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

documentbuilder db = dbf.newdocumentbuilder();

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

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

document doc = db.parse("c:/xml/message.xml");

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

jaxp支持w3c所推荐的dom 2。如果你对dom很熟悉,那么下面的内容就很简单了:只需要按照dom的规范来进行方法调用就可以。当然,如果你对dom不清楚,也不用着急,后面我们会有详细的介绍。在这儿,你所要知道并牢记的是:dom是用来描叙xml文档中的数据的模型,引入dom的全部原因就是为了用这个模型来操作xml文档的中的数据。dom规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取xml的数据。

从上面得到的document对象开始,我们就可以开始我们的dom之旅了。使用document对象的getelementsbytagname()方法,我们可以得到一个nodelist对象,一个node对象代表了一个xml文档中的一个标签元素,而nodelist对象,观其名而知其意,所代表的是一个node对象的列表:

nodelist nl = doc.getelementsbytagname("message");

我们通过这样一条语句所得到的是xml文档中所有标签对应的node对象的一个列表。然后,我们可以使用nodelist对象的item()方法来得到列表中的每一个node对象:

node my_node = nl.item(0);

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

string message = my_node.getfirstchild().getnodevalue();

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

现在,既然我们已经能够从xml文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。