位于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文档:

<?xml version = "1.0" encoding = "utf-8"?>
<School>
<Student>
<Name>沈浪</Name>
<Num>1006010022</Num>
<Classes>信管2</Classes>
<Address>浙江杭州3</Address>
<Tel>123456</Tel>
</Student>
<Student>
<Name>沈1</Name>
<Num>1006010033</Num>
<Classes>信管1</Classes>
<Address>浙江杭州4</Address>
<Tel>234567</Tel>
</Student>
<Student>
<Name>沈2</Name>
<Num>1006010044</Num>
<Classes>生工2</Classes>
<Address>浙江杭州1</Address>
<Tel>345678</Tel>
</Student>
<Student>
<Name>沈3</Name>
<Num>1006010055</Num>
<Classes>电子2</Classes>
<Address>浙江杭州2</Address>
<Tel>456789</Tel>
</Student>
</School>

  

DomDemo.java

   package xidian.sl.dom;
import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList; public class DomDemo {
/**
* 遍历xml文档
* */
public static void queryXml(){
try{
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//从DOM工厂中获得DOM解析器
DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
//把要解析的xml文档读入DOM解析器
Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");
System.out.println("处理该文档的DomImplementation对象 = "+ doc.getImplementation());
//得到文档名称为Student的元素的节点列表
NodeList nList = doc.getElementsByTagName("Student");
//遍历该集合,显示结合中的元素及其子元素的名字
for(int i = 0; i< nList.getLength() ; i ++){
Element node = (Element)nList.item(i);
System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());
System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());
System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());
System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());
System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());
} }catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
* 向已存在的xml文件中插入元素
* */
public static void insertXml(){
Element school = null;
Element student = null;
Element name = null;
Element num = null;
Element classes = null;
Element address = null;
Element tel = null;
try{
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//从DOM工厂中获得DOM解析器
DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
//把要解析的xml文档读入DOM解析器
Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");
//得到文档名称为Student的元素的节点列表
NodeList nList = doc.getElementsByTagName("School");
school = (Element)nList.item(0);
//创建名称为Student的元素
student = doc.createElement("Student");
//设置元素Student的属性值为231
student.setAttribute("examId", "23");
//创建名称为Name的元素
name = doc.createElement("Name");
//创建名称为 香香 的文本节点并作为子节点添加到name元素中
name.appendChild(doc.createTextNode("香香"));
//将name子元素添加到student中
student.appendChild(name);
/**
* 下面的元素依次加入即可
* */
num = doc.createElement("Num");
num.appendChild(doc.createTextNode("1006010066"));
student.appendChild(num); classes = doc.createElement("Classes");
classes.appendChild(doc.createTextNode("眼视光5"));
student.appendChild(classes); address = doc.createElement("Address");
address.appendChild(doc.createTextNode("浙江温州"));
student.appendChild(address); tel = doc.createElement("Tel");
tel.appendChild(doc.createTextNode("123890"));
student.appendChild(tel); //将student作为子元素添加到树的根节点school
school.appendChild(student);
//将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下
((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));
System.out.println("成功");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String[] args){
//读取
DomDemo.queryXml();
//插入
DomDemo.insertXml();
}
}

运行后结果:


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

打开查看内容:

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

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

package xidian.sl.dom;

import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element; public class CreateNewDom {
/**
* 创建xml文档
* */
public static void createDom(){
Document doc;
Element school,student;
Element name = null;
Element num = null;
Element classes = null;
Element address = null;
Element tel = null;
try{
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//从DOM工厂中获得DOM解析器
DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
//创建文档树模型对象
doc = dbBuilder.newDocument();
if(doc != null){
//创建school元素
school = doc.createElement("School");
//创建student元素
student = doc.createElement("Student");
//设置元素Student的属性值为231
student.setAttribute("examId", "23");
//创建名称为Name的元素
name = doc.createElement("Name");
//创建名称为 香香 的文本节点并作为子节点添加到name元素中
name.appendChild(doc.createTextNode("香香"));
//将name子元素添加到student中
student.appendChild(name);
/**
* 下面的元素依次加入即可
* */
num = doc.createElement("Num");
num.appendChild(doc.createTextNode("1006010066"));
student.appendChild(num); classes = doc.createElement("Classes");
classes.appendChild(doc.createTextNode("眼视光5"));
student.appendChild(classes); address = doc.createElement("Address");
address.appendChild(doc.createTextNode("浙江温州"));
student.appendChild(address); tel = doc.createElement("Tel");
tel.appendChild(doc.createTextNode("123890"));
student.appendChild(tel); //将student作为子元素添加到树的根节点school
school.appendChild(student);
//添加到文档树中
doc.appendChild(school);
//将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下
((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml"));
System.out.println("创建成功");
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String[] args) {
CreateNewDom.createDom();
}
}

运行结果:

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

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

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

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

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

    org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...

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

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

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

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

  5. java解析xml文档(dom)

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

  6. 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 ...

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

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

  8. 使用DOM解析XML文档

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

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

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

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

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

随机推荐

  1. 如何直接运行python文件

    1. 在Windows上是不能直接运行python文件的,但是,在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释: #!/usr/bin/env python3 print ...

  2. CodeForces 723F st-Spanning Tree

    $dfs$,构造. 类似于$k$度限制生成树的想法,可以将$s$和$t$先从图中删去,将剩下的部分求连通块,每个连通块内部很容易构造生成树,每个连通块缩成一个点来处理. 连通块分三种: $1$.只与$ ...

  3. Luogu P4148 简单题(K-D Tree)

    题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...

  4. 洛谷——P2121 拆地毯

    P2121 拆地毯 题目背景 还记得 NOIP 2011 提高组 Day1 中的铺地毯吗?时光飞逝,光阴荏苒,三年过去了.组织者精心准备的颁奖典礼早已结束,留下的则是被人们踩过的地毯.请你来解决类似于 ...

  5. windows上同时安装两个版本的mysql数据库

    一.先停止之前安装的低版本mysql服务 二.将其他电脑上安装好的mysql拷贝过来 三.拷贝过来之后,进入该文件夹,删除掉data目录,然后打开my.ini,进行修改端口号,端口号改为3307,ba ...

  6. 【转】python assert用法

    1.assert语句用来声明某个条件是真的.2.如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句.3 ...

  7. opencv中keypoint数据结构分析

    分析opencv中keypoint数据结构的相关信息,找到opencv的document(http://docs.opencv.org/java/org/opencv/features2d/KeyPo ...

  8. 虚拟PDF打印机

    doPDF虚拟打印机 doPDF 是一个免费的PDF转换器,可同时运用于商业和个人,它把自己安装为一个打印机驱动,允许从任意一个有打印输出的Windows程序中打印,还包含缩放,质量定义和页面大小定义 ...

  9. UTF8

    Here's a couple of functions (based on Brian Bondy's example) that use WideCharToMultiByte and Multi ...

  10. java使用HttpClient 发送get、pot请求

    package eidolon.messageback.PostUtil; import java.io.BufferedReader; import java.io.IOException; imp ...