用Jaxp包中的DOM技术对XML文件进行解析并完成对文件的CRUD操作

来源:互联网 发布:数据库怎么看表格 编辑:程序博客网 时间:2024/05/19 02:44

我们学习XML文件的相关知识最主要的还是能够根据相关的XML约束写出对应的XML文件并且能够向XML文件中为一些应用程序写入配置文件。

 

要想完成上述操作,我们就必须首先了解对XML文件解析技术的相关知识。

 

具体如下:

 

XML解析技术概述

 

XML解析方式分为两种:dom和sax

•        dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

•        sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

 

XML解析器

•        Crimson、Xerces 、Aelfred2

 

XML解析开发包

•        Jaxp、Jdom、dom4j

 

 

今天我们主要使用的是Jaxp  XML解析开发包对XML文件进行解析。

 

 

关于JAXP

 

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

 

在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

 

使用JAXP进行DOM解析

 

javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

 

 

获得JAXP中的DOM解析器

 

调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

 

调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

 

 

调用 DOM 解析器对象的 parse()方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

 

DOM编程

 

DOM模型(document object model)

•         DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

•         在dom中,节点之间关系如下:

•        位于一个节点之上的节点是该节点的父节点(parent)

•        一个节点之下的节点是该节点的子节点(children)

•        同一层次,具有相同父节点的节点是兄弟节点(sibling)

•        一个节点的下一个层次的节点集合是节点后代(descendant)

•        父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

 

Node对象

 

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

 

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

 

DOM方式解析XML文件

 

DOM解析编程

•        遍历所有节点

•        查找某一个节点

•        删除结点

•        更新结点

•        添加节点

 

DOM编程练习

 

更新XML文档

 

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

•        javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

•        用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

 

 Transformer对象通过TransformerFactory获得。

 

看一个简单示例:

Book.xml

 

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>

<book>

<bookname>Java程序设计</bookname>

<bookprice>40</bookprice>

<author>lijizh</author>

<publisher>lijizh1013</publisher>

</book>

 

Dom.java

 

package dtd;

 

import java.io.IOException;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

publicclass Dom {

 

   publicstaticvoid main(String[] args)throws ParserConfigurationException,SAXException, IOException {

      //获取解析工厂

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

      //创建解析器对象

      DocumentBuilder db = dbf.newDocumentBuilder();

      //获取Document对象

      Document d = db.parse("src/dtd/Book.xml");

      //通过Document对象的方法获取相应的节点列表

      NodeList nl = d.getElementsByTagName("bookname");

      //获取指定节点

      Node node = nl.item(0);

      //获取指定节点内容

      String content = node.getTextContent();

      //输出内容

      System.out.println(content);

      }

 

}

 

 

示例完成对XML文件的CRUD操作:

 

Book.xml

 

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>

<book>

<bookname>Java程序设计</bookname>

<bookprice>40</bookprice>

<author>lijizh</author>

<publisher>lijizh1013</publisher>

</book>

 

 

ReadDom.java

 

package dtd;

 

import java.io.IOException;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

importjavax.xml.transform.TransformerException;

importjavax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

importjavax.xml.transform.stream.StreamResult;

 

import org.junit.Test;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

publicclass ReadDom {

   @Test

  publicvoid read()throws ParserConfigurationException, SAXException, IOException{

      DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();

      DocumentBuilder db =factory.newDocumentBuilder();

      Document d = db.parse("src/dtd/Book.xml");

     

      Node node = d.getElementsByTagName("book").item(0);

   //  System.out.println(node.getNodeName());

      list(node);

     

  }

//用此方法遍历元素节点

privatevoid list(Node node) {

   if(node instanceof Element)

   {

      System.out.println(node.getNodeName());

   }

   NodeList list = node.getChildNodes();

   for(int i = 0;i< list.getLength();i++){

   Node node1 =list.item(i);

   list(node1);

   }

}

@Test

//以尾部追加的方式向XML文件中增添数据的方法

publicvoid insert()throws ParserConfigurationException, SAXException,IOException, TransformerException{

    DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

      DocumentBuilderdb = factory.newDocumentBuilder();

     Document d = db.parse("src/dtd/Book.xml");

     

     Element node = (Element)d.getElementsByTagName("book").item(0);

     Element newNode =d.createElement("color");

     newNode.setTextContent("red");

     node.appendChild(newNode);

      //通过转换工厂的newInstance()方法获取工厂实例

      TransformerFactory tff =TransformerFactory.newInstance();

      //获取转换器

      Transformer tf =tff.newTransformer();

      //通过转换器对象的transform方法将源与目标文件相连接

      tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

     

}

@Test

//以向前插入的方式向XML文件中增添数据的方法

publicvoid insert1()throws ParserConfigurationException, SAXException, IOException,TransformerException{

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

   DocumentBuilder db = factory.newDocumentBuilder();

   Document d = db.parse("src/dtd/Book.xml");

   

   Element node = (Element)d.getElementsByTagName("book").item(0);

   Element newNode = d.createElement("publisher");

   newNode.setTextContent("lijizh");

   Element refChild = (Element)d.getElementsByTagName("color").item(0);

   

   node.insertBefore(newNode, refChild);

   

   TransformerFactory tff = TransformerFactory.newInstance();

   Transformer tf = tff.newTransformer();

   tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

   

}

@Test

//XML文件中删除数据的方法

publicvoid delete()throws ParserConfigurationException, SAXException, IOException,TransformerException{

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

   DocumentBuilder db = factory.newDocumentBuilder();

   Document d = db.parse("src/dtd/Book.xml");

   

   Element node = (Element)d.getElementsByTagName("color").item(0);

   Element parent =(Element)node.getParentNode();

  parent.removeChild(node);

   

   TransformerFactory tff = TransformerFactory.newInstance();

   Transformer tf = tff.newTransformer();

   tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

   

}

@Test

////XML文件中更新数据的方法

publicvoid update()throws ParserConfigurationException, SAXException, IOException,TransformerException{

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

   DocumentBuilder db = factory.newDocumentBuilder();

   Document d = db.parse("src/dtd/Book.xml");

   

   Element node = (Element)d.getElementsByTagName("publisher").item(0);

   node.setTextContent("lijizh1013"); 

   TransformerFactory tff = TransformerFactory.newInstance();

   Transformer tf = tff.newTransformer();

   tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

   

}

 

}

}

 


原创粉丝点击