DOM模型(documentobject model)
•DOM解析器在解析XML文档时,会把文档中的全部元素,依照其出现的层次关系。解析成一个个Node对象(节点)。

•在dom中。节点之间关系例如以下:
•位于一个节点之上的节点是该节点的父节点(parent)
•一个节点之下的节点是该节点的子节点(children)
•同一层次。具有同样父节点的节点是兄弟节点(sibling)
•一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点

lNode对象提供了一系列常量来代表结点的类型。当开发者获得某个Node类型后,就能够把Node节点转换成对应的节点对象(Node的子类对象),以便于调用其特有的方法。

(查看API文档)

lNode对象提供了对应的方法去获得它的父结点或子结点。

编程人员通过这些方法就能够读取整个XML文档的内容、或加入、改动、删除XML文档的内容了。

首先引出要解析的xml文件:

<?

xml version="1.0" encoding="UTF-8"?><书架>
<书>
<书名>javaweb开发</书名>
<作者 id="12">张孝祥</作者>
<售价>59元</售价>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>

下面即是对xml的增删改查操作:

import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.junit.Before;
import org.junit.Test;
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; public class Demo3 { /**
* 利用dom完毕文档的crud
* @param args
* @throws Exception
* @throws ParserConfigurationException
* @throws Exception
* @throws SAXException
* @throws Exception
*/
private Document document;
@Before
public void before() throws Exception{
//获得dom解析工厂类
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析xml文件
document = builder.parse("src/book.xml");
} //遍历
@Test
public void listXml() throws ParserConfigurationException, SAXException, Exception{
list(document);
} public void list(Node node){
//打印结点的名称
System.out.println(node.getNodeName());
//获得全部子节点
NodeList list = node.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node child = list.item(i);
//递归整个dom树
list(child);
}
} //读取书名节点的值:<书名>javaweb开发</书名>
@Test
public void test1(){
Document document = this.document;
Node node = document.getElementsByTagName("书名").item(0);
String value = node.getTextContent();
System.out.println(value);
} //读取书名属性的值:<售价 type="rmb">39.00元</售价>
@Test
public void test2(){
Document document = this.document;
Node node = document.getElementsByTagName("售价").item(0);
Element price = (Element) node; //发现node满足不了,把node强转成对应类型
String attValue = price.getAttribute("type");
System.out.println(attValue);
} //向xml文档中加入售价节点
@Test
public void test3() throws Exception{
Document document = this.document;
//创建要挂的节点
Element price = document.createElement("售价");
price.setTextContent("59元");
//把创建的结点挂到书节点下
Node book = document.getElementsByTagName("书").item(0);
book.appendChild(price); //把内存中更新后对象树,又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
} //向xml文档中指定位置上加入售价节点
@Test
public void test4() throws Exception{
Document document = this.document; //创建要加入的节点
Element price = document.createElement("售价");
price.setTextContent("59元"); //得到要向哪个节点上挂子节点
Node book = document.getElementsByTagName("书").item(0); //向參考节点前。挂新节点
book.insertBefore(price, document.getElementsByTagName("售价").item(0)); //把内存中更新后对象树。又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //向xml文档加入节点属性
@Test
public void test5() throws Exception{
Document document = this.document; //得到要加入属性的节点
Element author = (Element) document.getElementsByTagName("作者").item(0);
author.setAttribute("id", "12"); //向节点挂属性 //把内存中更新后对象树,又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //删除xml文档中的售价节点
@Test
public void test6() throws Exception{ Document document = this.document; //得到要删除的节点
Node price = document.getElementsByTagName("售价").item(0); //得到要删除的节点的父亲
Node parent = document.getElementsByTagName("书").item(0); parent.removeChild(price); //把内存中更新后对象树,又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
} //删除2 : 删除售价节点所在的书结点
@Test
public void test7() throws Exception{ Document document = this.document; //得到要删除的节点
Node price = document.getElementsByTagName("售价").item(0);
price.getParentNode().getParentNode().removeChild(price.getParentNode()); //把内存中更新后对象树,又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
} @Test
public void test8() throws Exception{
Document document = this.document;
document.getElementsByTagName("售价").item(1).setTextContent("19元");
//把内存中更新后对象树,又一次定回到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
} }

xml它解析----DOM解析的更多相关文章

  1. XML文件解析DOM解析和SAX解析

    解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会 ...

  2. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  3. Java解析XML文档——dom解析xml

    一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...

  4. Xml解析(Dom解析xml)

    xml四种解析方式: DOM 平台无关的官方解析方式 优点:形成了树结构,直观好理解,代码更易编写 解析过程中树结构保留在内存中,方便修改 缺点:当xml文件较大时,对内存耗费比较大,容易影响解析性能 ...

  5. XML 解析---dom解析和sax解析

    眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...

  6. XML解析——DOM解析

    XML:可扩展性标记语言,主要用来传输和存储数据,相对于HTML的各种标签规范,XML的标签可以让用户根据语义自己进行定义,适用于web传输. JSON和XML的区别: (1).XML定义 扩展标记语 ...

  7. 2.3 使用 dom4j 对 xml文件进行 dom 解析

    // 使用dom4j对XML文档进行解析 CRUD public class Demo1 { //读取XML文档中第二本书的书名 <书名>javaWEB</书名> @Test ...

  8. xml文件使用DOM解析,报异常org.xml.sax.SAXParseException,"characterEncoding" 的引用必须以 ';' 分隔符结尾异常

    这个异常一般为xml文件对&的报错,只需要将&改为转义后的&amp即可解决

  9. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

随机推荐

  1. python语言学习4——使用文本编辑器

    在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样, ...

  2. 【WinRT】【译】【加工】在 XAML 中制作圆形图片

    原文:[WinRT][译][加工]在 XAML 中制作圆形图片 原文地址:http://timheuer.com/blog/archive/2015/05/06/making-circular-ima ...

  3. hdu2444(判二分图+最大匹配)

    传送门:The Accomodation of Students 题意:有n个学生,m对相互认识的,问能否分成两队,使得每对中没有相互认识的,如果可以求最大匹配,否则输出No. 分析:判断二分图用染色 ...

  4. 开发指南专题4:JEECG高速微云开发平台--JEECG开发环境的搭建

    开发指南专题4:JEECG微云高速开发平台开发环境搭建 1. JEECG开发环境搭建 JEECG推荐的开发环境为Myeclipse8.5/Eclipse3.7+JDK1.6+Tomcat6.0 1.1 ...

  5. linux下查看日志基本命令

    1.cat命令: 功能:1)显示整个文件. 演示样例: $ cat fileName 2)把文件串连接后传到基本输出,如将几个文件合并为一个文件或输出到屏幕. 演示样例: $ cat file1 fi ...

  6. 《Effective C++ 》学习笔记——条款02

    ****************************  一. Accustoming Yourself to C++ **************************** 条款02: Pref ...

  7. Linux iptables简单配置

    #!/bin/sh#modprobe ipt_MASQUERADEmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables -Fiptables -t ...

  8. 《SAS编程和数据挖掘商业案例》第14部分学习笔记

    继续<SAS编程与数据挖掘商业案例>学习笔记系列,本次重点:经常使用全程语句 所谓全程语句.是指能够用在不论什么地方的sas语句,既能够用在data数据步语句里面,也能够用在proc过程步 ...

  9. 在静态方法里调用spring注入的方法

    在静态方法里直接调用非静态方法是不行的. 那如何调用spring注入的方法呢? @Component public class AutoLoginUtil {     @Autowired     p ...

  10. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...