DOM简介
- DOM是Document Object Model的简称,翻译过来就是文档对象模型,
- 是 jdk针对w3c dom结构标准的实现,是W3C组织推荐的处理可扩展标志语言的标准编程接口
- 它以面向对象的方式描述了文档模型,所以有一个名词叫对象树,也叫文档树。
关于这个文档树,有几个名词需要知道:
节点(Node):XML中的每个成分都是节点
- 文档节点:即图中的:Document
- 每个标签是一个原元素节点即:Element
- XML元素标签之间的为文本节点:TextNode
- 每个XML元素节点的属性为属性节点:Attribute
xml常见的节点类型
- Node : DOM最基本的数据类型
- Element:常见的元素节点
- Attr:代表元素的属性
- Text:元素或者Att的值(内容)
- Document:代表整个XML文档
DOM解析XML
解析步骤:
- 建立DocumentBuilderFactor,用于获得DocumentBuilder对象:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 建立DocumentBuidler:
DocumentBuilder builder = factory.newDocumentBuilder();
- 建立Document对象,获取树的入口:
Document doc = builder.parse(“xml文件的相对路径或者绝对路径”);
- 建立NodeList:
NodeList n1 = doc.getElementByTagName(“读取节点”);
- 进行xml信息获取
DOM的一些常用的方法:
- Document.getDocumentElement():返回xml文档的根元素
- Element.getAttribute():获取属性值
- Element.getChildNodes():返回孩子节点集
- Element.getFirstChild():返回第一个孩子节点,通常是TextNode
- Element.getLastChild():得到最后一个孩子节点
- …
Node接口常用方法
NodeList:此接口表示一个点的集合,一般用于有序关系的一组节点。
案例:
1、 新建一个xml文件,users.xml
2、同样新建一个User类,User.java
public class User {
private long id;
private String name;
private String password;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
3、解析
第一步:加载xml资源,得到XML的Document对象
加载XML资源,这里和SAX一样,也可以是File或者Url
第二步:操作Doc,解析相应的数据
import com.cy.pojo.User;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class XmpParseUtils {
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
List<User> users=new ArrayList<>();
// 1. 加载XML资源,这里和SAX一样,也可以是File或者Uri
String url="mapper\\users.xml";
File file = new File(url);
// 2. 得到文档构建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 3. 通过构建工厂生产构建类
DocumentBuilder builder = factory.newDocumentBuilder();
// 4. 那这个构建类将XML资源解析得到Document对象
Document doc = builder.parse(file);
// 得到根节点
Element root = doc.getDocumentElement();
// 根据指定的标签名称得到相应的节点集合
NodeList userNodes = root.getElementsByTagName("user");
for(int i=0;i<userNodes.getLength();i++){
// 依次解析每个user节点
Element userElement = (Element) userNodes.item(i);
// 获取user节点的属性
int id = Integer.valueOf(userElement.getAttribute("id"));
User user = new User();
user.setId(id);
// 接下来解析子元素
NodeList childNodes = userElement.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
Node childNode = childNodes.item(j);
if(childNode.getNodeType() == Node.ELEMENT_NODE){ // 判断是不是元素节点
String nodeName = childNode.getNodeName(); // 得到节点名称
String value = childNode.getFirstChild().getNodeValue(); // 得到第一个子节点的值,这里为TextNode
if("name".equals(nodeName)){ // 如果当前的节点为name,那么它的值就是user的name
user.setName(value);
}else if("password".equals(nodeName)){ // 如果当前的节点为password,那么它的值就是user的password
user.setPassword(value);
}
}
}
users.add(user);
}
System.out.println(users);
}
}
总结:
DOM解析优点:
- 整个文档树在内存中,便于操作;
- 可以修改,删除、重新排列XML;
- 可以随机访问任何一个节点,访问效率高。
DOM解析的缺点:
- 占用内存大,占用资源多
- 解析速度慢
DOM解析适用场合:
- 需多次访问这些数据;
- 对解析效率要求不高;
- 硬件资源充足(内存、CPU)。