DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
优点:
a、由于整棵树在内存中,因此可以对xml文档随机访问
b、可以对xml文档进行修改操作
c、较sax,dom使用也更简单。
缺点:
a、整个文档必须一次性解析完
b、由于整个文档都需要载入内存,对于大文档成本高
例子:
public class Test {
public static void main(String[] args) throws Exception {
File file = new File("dom.xml");
(new Test()).readXML(file);
}
public void readXML(File file) throws Exception {
// 定义工厂APT,使应用程序能够从XML文件获取生成的DOM对象树的解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document 。
DocumentBuilder builder = factory.newDocumentBuilder();
// 通过将给定URI的内容解析为XML文档,并返回一个新的DOM Document对象
Document document = builder.parse(file);
// getDocumentElement()这是一个方便属性,允许直接访问作为文档的文档元素的子节点
Element element = document.getDocumentElement();
listAllChildNodes(element, 0);
}
// XML文档中节点(元素)的表示。 此接口使用用于获取和设置节点值,获取和设置节点的父节点以及删除节点的方法来扩展标准的DOM节点接口
public void listAllChildNodes(Node node, int level) {
if (node.getNodeType() == node.ELEMENT_NODE) {// 节点是 Element 。
boolean hasTextChild = false;
String levelSpace = "";
for (int i = 0; i < level; i++) {
levelSpace += " ";
}
System.out.print(levelSpace + "<" + node.getNodeName() + (node.hasAttributes() ? " " : ">"));
if (node.hasAttributes()) {// 返回此节点是否有任何子节点。
NamedNodeMap namedNodeMap = node.getAttributes();// A NamedNodeMap包含此节点的属性(如果是 Element )或 null否则。
for (int i = 0; i < namedNodeMap.getLength(); i++) {
System.out.print(namedNodeMap.item(i).getNodeName() + "=\""// 字符串里含双引号要用到转义字符\
+ namedNodeMap.item(i).getNodeValue() + "\""
+ (i == (namedNodeMap.getLength() - 1) ? "" : " "));
}
System.out.println(">");
}
if (node.hasChildNodes()) {// 返回此节点是否有任何子节点。
level++;
// NodeList接口提供了节点的有序集合的抽象,而不定义或约束如何实现该集合。 NodeList DOM中的对象是活的。
// NodeList中的项目可以通过整数索引访问,从0开始。
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() == Node.TEXT_NODE// 节点是一个 Text节点。
&& (!nodeList.item(i).getTextContent().matches("\\s+"))) {
hasTextChild = true;
System.out.print(nodeList.item(i).getTextContent());
} else if (nodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {
System.out.println();
listAllChildNodes(nodeList.item(i), level);
}
}
level--;
}
System.out.print(((hasTextChild) ? "" : "\n" + levelSpace) + "</" + node.getNodeName() + ">");
}
}
}
dom解码方式是通过将xml转化成树形结构,通过树的结点来对xml进行解析的,所以该方式能够对xml文档进行增删改查。