DOM解析:基于XML文档树结构的解析。
解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用DOM接口来操作这个树结构。
特点:
随机访问XML文件,内容可修改
不适合大文档
得到XML文件有三种方式:
1:通过文件方式读取:
File file=new File("F:""employees.xml");
Document doc=builder.parse(file);
2:通过一个URL方式读取:
Document doc=builder.parse(u);
3:可以能过java IO 流的读取:
编程步骤:
1.准备一个简单的xml文件-movies.xml,放入到Java项目中
<?xml version="1.0" encoding="UTF-8"?>
<Movies>
<Movie id="1">
<name>愤怒的小鸟</name>
<type>animation</type>
<year>2016</year>
</Movie>
<Movie id="2">
<name>叶问</name>
<type>action</type>
<language>chinese</language>
</Movie>
</Movies>
2.创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
3.创建一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
4.获取Document对象
Document document= db.parse("movies.xml");
5. 获得文档根元素下一级子元素所有元素
NodeList movies=document.getElementsByTagName("Movie");
Node movie=movies.item(i);
NamedNodeMap attrs=movie.getAttributes();
8.拿到一个子元素的属性集合
NodeList childNoides=movie.getChildNodes();
9.完整代码:
public class Dom {
public static void main(String[] args) {
//1.创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2.创建一个DocumentBuilder对象
try {
DocumentBuilder db=dbf.newDocumentBuilder();
//3.获取Document对象
Document document= db.parse("movies.xml");
System.out.println("开始解析");
//4.<span style="color: rgb(73, 73, 73); font-family: simsun; font-size: 14px; line-height: 21px;">获得文档根元素下一级子元素所有元素</span>
NodeList movies=document.getElementsByTagName("Movie");
System.out.println("共有"+movies.getLength()+"部电影");
for(int i=0;i<movies.getLength();i++){
System.out.println("--------------");
System.out.println("正在解析第"+(i+1)+"部电影");
//5.拿到一个子元素
Node movie=movies.item(i);
//6.拿到一个子元素的属性
NamedNodeMap attrs=movie.getAttributes();
for(int j=0;j<attrs.getLength();j++){
Node attr=attrs.item(j);
System.out.print("属性名:"+attr.getNodeName()+" ");
System.out.println("属性值:"+attr.getNodeValue());
}
//7.拿到一个子元素的属性集合
NodeList childNoides=movie.getChildNodes();
for(int k=0;k<childNoides.getLength();k++){
Node child=childNoides.item(k);
if(child.getNodeType()==Document.ELEMENT_NODE){
System.out.println("节点名"+child.getNodeName());
//System.out.println("节点值"+child.getNodeValue());
System.out.println("节点值:"+child.getFirstChild().getNodeValue());
}
}
System.out.println("第"+(i+1)+"部电影解析结束");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
10.效果图: