dom解析xml,会一次性读入xml文件,会把文件中的所有元素,解析成一个个Node对象节点。dom解析是基于树和节点的文档,通过操作节点的相关方法,可以获取节点的属性,节点的内容,也可以获节点的子节点,如此便可以对xml文件进行解析。
所以说dom解析便于操作,可以轻松完成增删改查,
不过dom解析的文档不适合过大,由于它是将文档读入内存之中,
过大的文件影响了机器性能,甚至容易导致内存溢出。
Node对象提供了很多常量,表示当前结点的类型,基于Node对象的操作会相对比较复杂,所以我们可以把Node转成其对应子类,子类里提供了很多便捷的方法去获取数据。如把Node类型的对象转成Element对象。
XML文档内容;
![](https://i-blog.csdnimg.cn/blog_migrate/6c96886e4fb64114fed90f08af5ce7e5.png)
解析思路;
1,创建工厂实例 2,创建工厂解析器 3,给定指定的xml文件 需要用到重要的方法; getChildNodes()获取标签的元素 getTextContent获取标签元素的内容 getAttributes获取元素的属性
JAVA解析xml文档代码如下;
方法一:
package Dom解析;
/**
* 设置对象的基本属性
* @author Administrator
*
*/
public class Student {
String name;
String sex;
String cla;
int no;
int num;
}
解析代码类;
package Dom解析;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* DOM解析XML文档
* @author Administrator
*
*/
public class DOMParse {
// 创建队列保存对象
private static ArrayList<Student> liststu = new ArrayList<Student>();
// 设置对象
static Student stu = null;
public static void main(String[] args) throws Exception {
String path = "C:\\Users\\Administrator\\Desktop\\xml\\student2.xml";
// 1,实例化一个用来生产DOM解析器的工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2使用工厂得到一个DOM解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3,给定制定的xml文件
Document doc = builder.parse(path);
pausexml(doc);
//遍历队列
for (Student stu : liststu) {
System.out.println(stu.name + " " + stu.no + " " + stu.num + " "
+ stu.cla + " " + stu.sex);
}
}
// 解析xml的方法
public static void pausexml(Node node) {
// 获得所有的子节点,得到所有子节点的节点队列
NodeList list = node.getChildNodes();
// 遍历队列,依次取出
for (int i = 0; i < list.getLength(); i++) {
Node node1 = list.item(i);
// 遍历节点的名称和值
String str = node1.getNodeName();
// System.out.println(val);
//判断Node1是不是元素
if (node1 instanceof Element) {
if (str.equals("stu")) {
//创建对象
stu = new Student();
//将创建的对象放到队列中
liststu.add(stu);
// 获得该节点元素的属性
NamedNodeMap nnm = node1.getAttributes();
// 遍历节点中的元素
for (int j = 0; j < nnm.getLength(); j++) {
Node nodelist = nnm.item(j);
// 根据遍历出来的元素得到该节点元素属性的名字和值
String name = nodelist.getNodeName();
String value = nodelist.getNodeValue();
// System.out.println(name +"<<<>>>>"+value);
if (name.equals("no")) {
//如果是no就转化为int型
stu.no = Integer.parseInt(value);
}
if (name.equals("num")) {
stu.num = Integer.parseInt(value);
}
}
}
if (str.equals("name")) {
stu.name = node1.getTextContent();
}
if (str.equals("sex")) {
// 如果标签是sex
stu.sex = node1.getTextContent();
// System.out.println(sex + ">>>>>>>>>>>>>>>>>>>>");
}
if (str.equals("cla")) {
stu.cla = node1.getTextContent();
// System.out.println(cla + "<<<<<<<<<<<<<<<");
}
}
pausexml(node1);
}
}
}
运行结果:
张三丰 1234 1111 武当 男
小龙女 2345 0 古墓 女
小龙女 2345 0 古墓 女
解析方法二:
package Dom解析;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* DOM解析XML文档
*
* @author Administrator
*
*/
public class ReadDOMParse {
public static void main(String[] args) throws Exception {
String path = "C:\\Users\\Administrator\\Desktop\\xml\\student2.xml";
// 1.实例化工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2,创建工厂实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 3,解析
Document doc = builder.parse(path);
//获取元素的名称并返回
NodeList nodelist = doc.getElementsByTagName("stu");
//遍历队列
for(int i = 0;i<nodelist.getLength();i++){
// 输出名字
System.out.println("name:"
+ doc.getElementsByTagName("name").item(i).getFirstChild()
.getNodeValue());
// 输出性别
System.out.println("sex:"
+ doc.getElementsByTagName("sex").item(i).getFirstChild()
.getNodeValue());
// 输出班级
System.out.println("cla:"
+ doc.getElementsByTagName("cla").item(i).getFirstChild()
.getNodeValue());
}
}
}
运行结果;
name:张三丰
sex:男
cla:武当
name:小龙女
sex:女
cla:古墓
sex:男
cla:武当
name:小龙女
sex:女
cla:古墓