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

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,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文档:

  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

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

运行后结果:


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

打开查看内容:

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

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

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

运行结果:

精讲 org.w3c.dom(java dom)解析XML文档的更多相关文章

  1. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

  2. Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术

    一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...

  3. Java解析XML文档——dom解析xml

    一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...

  4. java解析xml文档(dom)

    DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...

  5. JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)

    使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...

  6. DOM生成XML文档与解析XML文档(JUNIT测试)

    package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...

  7. 使用DOM解析XML文档

    简单介绍一下使用DOM解析XML文档,解析XML文件案例: <?xml version="1.0" encoding="UTF-8"?> -< ...

  8. 浅谈用java解析xml文档(四)

    继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使 ...

  9. Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术

    一.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. Jdom由6个包构成: Element类表示XML文档的元素 org.jdom: 解析xml ...

随机推荐

  1. BZOJ 4919 (树上LIS+启发式合并)

    题面 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i, ...

  2. Kotlin学习(3)类

    声明类和接口: //类 class A{ } //接口,接口中的方法可以有默认实现 interface B{ fun show(){ print("i'm B") } } //用冒 ...

  3. spring data jpa和spring data redis同时配置时,出现Multiple Spring Data modules found, entering strict repository configuration mode错误

    问题说明 data jpa和data redis同时配置时,出现Spring modules spring Spring Data Release Train <dependencyManage ...

  4. LNMP集群架构篇

    一.LNMP介绍 1.使前端web服务和后端存储服务进行串联 2.主要实现处理php动态请求 工作原理: L:linux  N:nginx  M:mysql   P:php 二.lnmp部署 我的环境 ...

  5. linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思

    最近跟一个运维人员学了点新东西,感觉以前没怎么注意,但现在感觉很有用,特来记录一下. linux使用==ll==命令列出列表的时候,前面总是有一堆drwxr-xr-x ,这些代表什么意思从来还没有去在 ...

  6. qt05 音乐播放器

    这些步骤可实现音乐播放,但是列表不能显示 music = new QMediaPlayer(this); playlist = new QMediaPlaylist(this); playlist-& ...

  7. image按钮新增的width属性和height属性

    代码实例: test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  8. linux环境进程开机自检脚本

    Linux下shell脚本监控Tomcat的状态并实现自动启动 最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linu ...

  9. $2019$各种$WC$没去记

    \(2019\)各种\(WC\)没去记 太弱了去不了啊. 至少我联赛没退役是吧...(退役感++ 不过这个分数线还是有点让人自闭啊,划线人绝对有毒,有人关照一下空巢老人\(mona\)喵? 这里大概是 ...

  10. 利用docker制作一个带有redis软件的镜像,供其他人使用

    1. 宿主机在etc/apt/下创建一个haha的文件夹 2.宿主机将haha文件夹映射到容器的虚拟系统中etc/apt/ 3. 此时,可以在宿主机和容器虚拟机中同步创建和删除文件 4. 将宿主机中的 ...