- DOM(Document Object Model)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
③基于树结构,比较耗资源,适用于多次访问XML。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
2.DOM读取XML的步骤:
1、创建解析器工厂对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
2、由解析器工厂对象创建解析器对象
DocumentBuilder db=dbf.newDocumentBuilder();
3、由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象。
Document document=db.parse(“XML文件路径”);
3.对XML文件进行查询,修改和删除。
1、查询。(对TEXT_NODE类型的节点,输出其text) 方法: print(document);
public static void print(Node n) { //把document转为Node型
//获取所有的孩子节点
NodeList nl = n.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
//判断是否为TEXT_NODE类型,true 的话就继续判断
if (node.getNodeType() == Node.TEXT_NODE) {
//XML中换行空格也是一种节点,需要把他们去掉,要不然输出时会有很多空格
if (!"".equals(node.getTextContent().trim())) {
//打印文本
System.out.println(node.getTextContent());
}
} else {
//不是TEXT_NODE类型,则进行递归判断,直到打印出所有的TEXT_NODE类型
print(node);
}
}
}
2、更新节点 update(Node node);
1.先找到你所要改的节点:
Node n1= doc.getElementsByTagName(“student”).item(0);//如,我要找所有student的节点的 第一个student,把它当参数穿进去。
public static void update(Node node) {
//判断是ELEMENT_NODE类型的结点,
if (node.getNodeType() == Node.ELEMENT_NODE) {
//Node转换为子类Element,有更多的方法
Element element = (Element) node;
//设置属性
element.setAttribute("address", "北京");
//得到子节点name中的第一个(因为一个student中,其实可以设置很多个<name>标签,我们这只有一个,所以取其第一个)
Element name = (Element) element.getElementsByTagName("name").item(0);
//设置文本
name.setTextContent("奥巴马");
}
}
3、删除节点 remove(Document doc);
public static void remove(Document doc) {
//获取第2个student ,删除它
Element e = (Element) doc.getElementsByTagName("student").item(2);
//先获取它的父节点,再通过父节点删除自己(自己不能删除自己)
e.getParentNode().removeChild(e);
}
4、新增节点 add(Document doc);
public static void add(Document doc) throws Exception {
// 先找到跟元素,因为DOM是树状,的找到跟节点再去添加分支
Element root = (Element) doc.getElementsByTagName("students").item(0);
// 创建一个student
Element student = doc.createElement("student");
// 设置属性
student.setAttribute("address", "长沙");
// 创建ID name course scores
Element ID = doc.createElement("id");
ID.setTextContent("3");
Element name = doc.createElement("name");
name.setTextContent("瑞文");
Element course = doc.createElement("course");
course.setTextContent("英雄联盟");
Element scores = doc.createElement("scores");
scores.setTextContent("120");
// 把它们都加到student里面去
student.appendChild(ID);
student.appendChild(name);
student.appendChild(course);
student.appendChild(scores);
// 再把student 加到root 下面
root.appendChild(student);
// 把他写入XML文档
transformTo(doc);
}
5、以上的操作都是把XML读入内存里面,在内存里面进行修改,而我们就要把我们修改后的内存里面的XML 写入到实际的(硬盘)的XML中。 transformTo(Document doc);
public static void transformTo(Document doc) throws Exception {
// 同样的得到转换工厂
TransformerFactory factory = TransformerFactory.newInstance();
//获得其实例
Transformer transformer = factory.newTransformer();
//这个是用来限制格式的,但是你的XML文件就要有一个DTD 文件,在文件写入时,会按照你的DTD文件的格式来,而不会全部都挤在一行
transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
//2个参数,第一个是源,即你的document,第二个是输出流,指向你的XML文件路径。也可以查API
transformer.transform(new DOMSource(doc), new StreamResult("20160829/students.xml"));
}