org.w3c.dom(java dom)解析XML文档

来源:互联网 发布:巨人数据库 编辑:程序博客网 时间:2024/05/29 04:36

JAVA使用DOM解析XML:

首先来了解点Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml");  b.将需要解析的xml文档转化为输入流InputStream is = new FileInputStream("bean.xml");

 Document doc = db.parse(is); 

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,

直接在这个Document对象上进行操作即可;

 包含的方法:

4.节点列表类NodeList

NodeList代表了一个包含一个或者多个Node的列表,根据操作可以将其简化的看做为数组

5.节点类Node

Node对象是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等

6.元素类Element

是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法

7.属性类Attr

代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部

基本的知识就到此结束,更加具体的大家可以参阅JDK API文档

代码:

1.使用DOM来遍历XML文档中的全部内容并且插入元素:

school.xml文档:

[html] view plaincopyprint?
  1. <?xml version = "1.0" encoding = "utf-8"?>  
  2. <School>  
  3.     <Student>  
  4.         <Name>沈浪</Name>  
  5.         <Num>1006010022</Num>  
  6.         <Classes>信管2</Classes>  
  7.         <Address>浙江杭州3</Address>  
  8.         <Tel>123456</Tel>  
  9.     </Student>  
  10.     <Student>  
  11.         <Name>沈1</Name>  
  12.         <Num>1006010033</Num>  
  13.         <Classes>信管1</Classes>  
  14.         <Address>浙江杭州4</Address>  
  15.         <Tel>234567</Tel>  
  16.     </Student>  
  17.     <Student>  
  18.         <Name>沈2</Name>  
  19.         <Num>1006010044</Num>  
  20.         <Classes>生工2</Classes>  
  21.         <Address>浙江杭州1</Address>  
  22.         <Tel>345678</Tel>  
  23.     </Student>  
  24.     <Student>  
  25.         <Name>沈3</Name>  
  26.         <Num>1006010055</Num>  
  27.         <Classes>电子2</Classes>  
  28.         <Address>浙江杭州2</Address>  
  29.         <Tel>456789</Tel>  
  30.     </Student>  
  31. </School>  

DomDemo.java

[java] view plaincopyprint?
  1. package xidian.sl.dom;  
  2.   
  3. import java.io.FileOutputStream;  
  4.   
  5. import javax.xml.parsers.DocumentBuilder;  
  6. import javax.xml.parsers.DocumentBuilderFactory;  
  7.   
  8. import org.apache.crimson.tree.XmlDocument;  
  9. import org.w3c.dom.Document;  
  10. import org.w3c.dom.Element;  
  11. import org.w3c.dom.NodeList;  
  12.   
  13.   
  14. public class DomDemo {  
  15.     /** 
  16.      * 遍历xml文档 
  17.      * */  
  18.     public static void queryXml(){  
  19.         try{  
  20.             //得到DOM解析器的工厂实例  
  21.             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();  
  22.             //从DOM工厂中获得DOM解析器  
  23.             DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();  
  24.             //把要解析的xml文档读入DOM解析器  
  25.             Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");  
  26.             System.out.println("处理该文档的DomImplementation对象  = "+ doc.getImplementation());  
  27.             //得到文档名称为Student的元素的节点列表  
  28.             NodeList nList = doc.getElementsByTagName("Student");  
  29.             //遍历该集合,显示结合中的元素及其子元素的名字  
  30.             for(int i = 0; i< nList.getLength() ; i ++){  
  31.                 Element node = (Element)nList.item(i);  
  32.                 System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());  
  33.                 System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());  
  34.                 System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());  
  35.                 System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());  
  36.                 System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());  
  37.             }  
  38.               
  39.         }catch (Exception e) {  
  40.             // TODO: handle exception  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44.     /** 
  45.      * 向已存在的xml文件中插入元素 
  46.      * */  
  47.     public static void insertXml(){  
  48.         Element school = null;  
  49.         Element student = null;  
  50.         Element name = null;  
  51.         Element num = null;  
  52.         Element classes = null;  
  53.         Element address = null;  
  54.         Element tel = null;  
  55.         try{  
  56.             //得到DOM解析器的工厂实例  
  57.             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();  
  58.             //从DOM工厂中获得DOM解析器  
  59.             DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();  
  60.             //把要解析的xml文档读入DOM解析器  
  61.             Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");  
  62.             //得到文档名称为Student的元素的节点列表  
  63.             NodeList nList = doc.getElementsByTagName("School");  
  64.             school = (Element)nList.item(0);  
  65.             //创建名称为Student的元素  
  66.             student = doc.createElement("Student");  
  67.             //设置元素Student的属性值为231  
  68.             student.setAttribute("examId""23");  
  69.             //创建名称为Name的元素  
  70.             name = doc.createElement("Name");  
  71.             //创建名称为 香香 的文本节点并作为子节点添加到name元素中  
  72.             name.appendChild(doc.createTextNode("香香"));  
  73.             //将name子元素添加到student中  
  74.             student.appendChild(name);  
  75.             /** 
  76.              * 下面的元素依次加入即可 
  77.              * */  
  78.             num = doc.createElement("Num");  
  79.             num.appendChild(doc.createTextNode("1006010066"));  
  80.             student.appendChild(num);  
  81.               
  82.             classes = doc.createElement("Classes");  
  83.             classes.appendChild(doc.createTextNode("眼视光5"));  
  84.             student.appendChild(classes);  
  85.               
  86.             address = doc.createElement("Address");  
  87.             address.appendChild(doc.createTextNode("浙江温州"));  
  88.             student.appendChild(address);  
  89.               
  90.             tel = doc.createElement("Tel");  
  91.             tel.appendChild(doc.createTextNode("123890"));  
  92.             student.appendChild(tel);  
  93.               
  94.             //将student作为子元素添加到树的根节点school  
  95.             school.appendChild(student);  
  96.             //将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下  
  97.             ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));  
  98.             System.out.println("成功");  
  99.         }catch (Exception e) {  
  100.             // TODO: handle exception  
  101.             e.printStackTrace();  
  102.         }      
  103.     }  
  104.     public static void main(String[] args){  
  105.         //读取  
  106.         DomDemo.queryXml();  
  107.         //插入  
  108.         DomDemo.insertXml();  
  109.     }  
  110. }  

运行后结果:

 


然后到目录下查看生成的xml文件:

打开查看内容:

上面添加元素后输出的文件与之前的文件不是同一个文件,如果需要输出到原文件中,那么只要将路径改为原文间路径即可:src/xidian/sl/dom/school.xml

 

2.创建XML过程与插入过程相似,就是Document需要创建

[java] view plaincopyprint?
  1. package xidian.sl.dom;  
  2.   
  3. import java.io.FileOutputStream;  
  4.   
  5. import javax.xml.parsers.DocumentBuilder;  
  6. import javax.xml.parsers.DocumentBuilderFactory;  
  7.   
  8. import org.apache.crimson.tree.XmlDocument;  
  9. import org.w3c.dom.Document;  
  10. import org.w3c.dom.Element;  
  11.   
  12.   
  13. public class CreateNewDom {  
  14.     /** 
  15.      * 创建xml文档 
  16.      * */  
  17.     public static void createDom(){  
  18.         Document doc;  
  19.         Element school,student;  
  20.         Element name = null;  
  21.         Element num = null;  
  22.         Element classes = null;  
  23.         Element address = null;  
  24.         Element tel = null;  
  25.         try{  
  26.             //得到DOM解析器的工厂实例  
  27.             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();  
  28.             //从DOM工厂中获得DOM解析器  
  29.             DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();  
  30.             //创建文档树模型对象  
  31.             doc = dbBuilder.newDocument();  
  32.             if(doc != null){  
  33.                 //创建school元素  
  34.                 school = doc.createElement("School");  
  35.                 //创建student元素  
  36.                 student = doc.createElement("Student");  
  37.                 //设置元素Student的属性值为231  
  38.                 student.setAttribute("examId""23");  
  39.                 //创建名称为Name的元素  
  40.                 name = doc.createElement("Name");  
  41.                 //创建名称为 香香 的文本节点并作为子节点添加到name元素中  
  42.                 name.appendChild(doc.createTextNode("香香"));  
  43.                 //将name子元素添加到student中  
  44.                 student.appendChild(name);  
  45.                 /** 
  46.                  * 下面的元素依次加入即可 
  47.                  * */  
  48.                 num = doc.createElement("Num");  
  49.                 num.appendChild(doc.createTextNode("1006010066"));  
  50.                 student.appendChild(num);  
  51.                   
  52.                 classes = doc.createElement("Classes");  
  53.                 classes.appendChild(doc.createTextNode("眼视光5"));  
  54.                 student.appendChild(classes);  
  55.                   
  56.                 address = doc.createElement("Address");  
  57.                 address.appendChild(doc.createTextNode("浙江温州"));  
  58.                 student.appendChild(address);  
  59.                   
  60.                 tel = doc.createElement("Tel");  
  61.                 tel.appendChild(doc.createTextNode("123890"));  
  62.                 student.appendChild(tel);  
  63.                   
  64.                 //将student作为子元素添加到树的根节点school  
  65.                 school.appendChild(student);  
  66.                 //添加到文档树中  
  67.                 doc.appendChild(school);  
  68.                 //将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下  
  69.                 ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml"));  
  70.                 System.out.println("创建成功");  
  71.             }  
  72.         }catch (Exception e) {  
  73.             // TODO: handle exception  
  74.             e.printStackTrace();  
  75.         }  
  76.     }  
  77.     public static void main(String[] args) {  
  78.         CreateNewDom.createDom();  
  79.     }  
  80. }  

运行结果:

DOM的操作应该还是非常简单明了的,掌握了没哦。


原文链接:http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html
0 0