`
and4walker
  • 浏览: 557743 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DOM

    博客分类:
  • XML
阅读更多
DOM(Document Object Model):W3C组织推荐的处理XML的标准接口.
http://www.w3.org/DOM/DOMTR.html

DOM特点:首先将整个XML文档读取到内存中才能进行某些操作,如果XML文档很大,则会影响性能。

DOM结构模型:
DOM的核心概念就是NODE(节点).DOM在分析XML文档时,将组成XML文档的各个部分(元素,属性,文本,注释,处理指令等)映射成一个对象,这个对象就叫做节点。在内存中这些节点形成一棵树。整棵树就是一个节点,树中的每一个节点也是一棵树。
DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。

DOM解析器工厂:javax.xml.parsers.DocumentBuilderFactory
第一种使用其系统属性的方式:
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
第二种使用其系统属性的方式:
java -Djava.xml.parsers.DocumentBuilderFactory = oracle.xml.jaxp.JXDocumentBuilderFactory DOMTest
第三种方式:
如果不想使用JDK默认的解析器,比如使用apache的Xerces解析器,只需建立JRE\lib\endorsed目录,然后将xercesImpl.jar文件copy到其目录下。

DOM树中的节点类型:
DOM本质上是节点的集合。由于一个文档中可能包含不同类型的信息,因此要定义不同类型的节点。XML中最常见的节点类型:文档,元素,文本,属性,其他不常用的节点类型包括:注释,处理指令,文档类型,CDATA段,文档片段,实体,实体引用,记号。
文档节点:文档树的根节点,也是文档中其他所有节点的父节点。但是不是根元素,因为XML文档中注释,处理指令等可以出现在根元素之外,所以在构造DOM树时,根元素并不适合作为根节点,于是就有了文档节点。根元素则作为文档节点的子节点。文档节点通过org.w3c.dom.Document接口来实现。
元素节点:XML文档中的元素。通常元素拥有子元素,文本节点或两者结合。元素节点也是唯一能够拥有属性的节点类型。该节点通过org.w3c.dom.Element接口来实现。
文本节点:只包含文本内容(在XML中称为字符数据)的节点,它可以由更多信息组成,也可包含空白。在文档树中元素跟属性的文本内容都是由文本节点来表示的。该节点通过org.w3c.dom.Text接口来实现,Text接口继承CharacterData接口。
属性节点:元素中的属性。属性实际上是附属元素的,所以属性节点不能被看作是元素的子节点,即属性没有被认为是文档树的一部分,例如在属性节点上调用getParentNode(),getPreviousSibling()和getNextSibling()返回都是NULL。
也就是说属性节点被看作包含他的元素节点的一部分,它并不作为单独的一个节点在文档树中出现。该节点通过org.w3c.dom.Attribute接口来实现。
注释节点:该节点通过org.w3c.dom.Comment接口来实现。
处理指令节点:表示XML文档中的处理指令。该节点通过org.w3c.dom.ProcessingInstruction接口来实现。
文档类型节点:每一个Document都有一个doctype属性,其值炜null或DocumentType对象。该节点通过org.w3c.dom.DocumentType接口来实现。
CDATA段节点表示XML文档中的CDATA段。该节点通过org.w3c.dom.CDAT
ASection接口来实现。该接口继承自Text接口。
实体节点:XML文档中已分析或未分析实体。该节点通过org.w3c.dom.Entity接口来实现。
实体引用节点:DOM树中的一个实体引用。该节点通过org.w3c.dom.EntityReference接口来实现。
记号节点:在DTD中声明的记号。该节点通过org.w3c.dom.Notation接口来实现。


NodeList接口:提供了一个有序节点集合的抽象。该方法下定义了两个方法:
1.int getLength():该方法返回列表中节点的数目。
2.Node item(int index):该方法返回集合中指定索引的节点。集合中的索引从0开始。
注意:DOM中的NodeList对象是动态的。eg.使用Node接口的getChildNodes()得到一个节点的子节点列表,然后你调用insertBefore(),appendChild(),replaceChild()和removeChild()等任何一个方法,都将影响到NodeList对象,也就是说此时再调用getLength()和item()将返回与先前不同的值。

org.w3c.dom.NamedNodeMap接口:也是节点的集合。通过该接口可以建立节点名跟节点之间的一一映射,从而利用节点名直接访问对应的节点。
注意:该接口无序。并不是继承自NodeList接口。并且该接口也是动态的。
eg.在某个元素节点上调用getAttributes()将返回一个包含属性名和属性节点映射的NamedNodeMap对象。

DOM实例一:得到文本节点的内容
students.xml
<?xml version="1.0" encoding="gb2312"?>

<?xml-stylesheet type="text/xml" href="students.xsl">

<students>
  <student sn="01">
     <name>张三</name>
     <age>11</age>
  </student>
  <student sn="02">
     <name>李四</name>
     <age>14</age>
  </student>
</students>

java类:DOMStudentInfo.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 DOMStudentInfo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(new File("students.xml"));
			NodeList nl = doc.getElementsByTagName("student");
			int len = nl.getLength();
			for(int i=0;i<len;i++){
				Element eltStu = (Element)nl.item(i);
				Node eltName = eltStu.getElementsByTagName("name").item(0);
				Node eltAge = eltStu.getElementsByTagName("age").item(0);
				//注意:此时不能用eltName.getNodeValue()得到“张三”的值
				//因为"张三"这个文本节点是name的子节点,所以得调用
				//eltName.getFirstChild().getNodeValue()来得到"张三"的值
				System.out.println("name:"+eltName.getFirstChild().getNodeValue());
				System.out.println("age:"+eltAge.getFirstChild().getNodeValue());
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

DOM实例二:循环遍历文档中的所有NODE
java类:DOMPrinter.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;


public class DOMPrinter {

	public void printNodeInfo(Node node){
		System.out.println(node.getNodeName()+":"+node.getNodeValue());
	}
	
	public void printNode(Node node){
		short nodeType = node.getNodeType();
		switch(nodeType){
			case Node.PROCESSING_INSTRUCTION_NODE:
				System.out.println("=====指令节点开始=====");
				System.out.println(node);
				System.out.println("=====指令节点结束=====");
				break;
			case Node.ELEMENT_NODE:
				System.out.println("=====元素节点开始=====");
				System.out.println(node);
				System.out.println("=====元素节点结束=====");
				//得到元素节点的全部属性
				NamedNodeMap attrs = node.getAttributes();
				int attrNum = attrs.getLength();
				for(short i=0;i<attrNum;i++){
					Node attr = attrs.item(i);
					System.out.println("=====元素节点的属性开始=====");
					printNodeInfo(attr);
					System.out.println("=====元素节点的属性结束=====");
				}
				break;
			case Node.TEXT_NODE:
				System.out.println("=====文本节点的属性开始=====");
				printNodeInfo(node);
				System.out.println("=====文本节点的属性结束=====");
				break;
			default:
				break;
		}
		Node child  = node.getFirstChild();
		while(null != child){
			printNode(child);
			child = child.getNextSibling();
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(new File("students.xml"));
			DOMPrinter domPrinter = new DOMPrinter();
			domPrinter.printNode(doc);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

DOM实例三:在节点树中添加/删除节点,xml转换
java类:DOMConvert.java
import java.io.File;
import java.io.IOException;
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.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DOMConvert {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(new File("students.xml"));
			//创建元素节点
			Element eltStu = doc.createElement("student");
			Element eltName = doc.createElement("name");
			Element eltAge = doc.createElement("age");
			//创建文本节点
			Text textName = doc.createTextNode("王五");
			Text textAge = doc.createTextNode("19");
			//创建元素节点与文本节点的关系
			eltName.appendChild(textName);
			eltAge.appendChild(textAge);
			//创建元素节点之间的关系
			eltStu.appendChild(eltName);
			eltStu.appendChild(eltAge);
			//设定最外层元素节点的属性
			eltStu.setAttribute("sn", "03");
			//上面只是添加跟students平行的树节点
			//如果想在students下面建立必须先得到students的元素节点
			Element root = doc.getDocumentElement();
			root.appendChild(eltStu);
			//删除“张三”的节点树
			NodeList nl = root.getElementsByTagName("student");
			root.removeChild(nl.item(0));
			//此时NodeList为动态的,“李四”成为第一个树节点
			//修改“李四”节点的年龄为65
			Element eltStuChg = (Element)nl.item(0);
			Node nodeAgeChg = eltStuChg.getElementsByTagName("age").item(0);
			nodeAgeChg.getFirstChild().setNodeValue("65");
			//打印出来
			int len = nl.getLength();
			for(int i=0;i<len;i++){
				Element elt = (Element)nl.item(i);
				System.out.println("编号:"+elt.getAttribute("sn"));
				Node nodeName = elt.getElementsByTagName("name").item(0);
				Node nodeAge = elt.getElementsByTagName("age").item(0);
				String name = nodeName.getFirstChild().getNodeValue();
				String age = nodeAge.getFirstChild().getNodeValue();
				System.out.println("姓名:"+name);
				System.out.println("年龄:"+age);
				System.out.println("=====================");
			}
			//此时想将一个xml文件复制到另一个xml文件中,两种方案:
			//1.直接读取内容然后再生成;2.调用TransformerFactory
			//此时存在一个缺点就是不是well-formed
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer tf = tff.newTransformer();
			tf.setOutputProperty("encoding", "gb2312");
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(new File("converted.xml"));
			tf.transform(source,result);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		
	}

}

DOM实例四:获取XML文档声明信息
hr.xml
<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE hr PUBLIC "-//xin sun//DTD HR 1.0//ZH" 
                    "hr.dtd"
[
<!ENTITY name "人力资源">
]>

<hr>&name;</hr>

hr.dtd
<!ELEMENT hr (#PCDATA)>
<!ENTITY % entitiesDecl SYSTEM "entity.dtd">
%entitiesDecl;

entity.dtd
<!NOTATION gif SYSTEM "image/gif">
<!NOTATION jpg SYSTEM "iexplore.exe">

<!ENTITY logo SYSTEM "http://orz.iteye.com/logo.gif" NDATA gif>
<!ENTITY banner SYSTEM "http://orz.iteye.com/banner.gif" NDATA jpg>

DOMDocTypePrinter.java:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Notation;
import org.xml.sax.SAXException;


public class DOMDocTypePrinter {

	public static void main(String[] args) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse("hr.xml");
			DocumentType docType = doc.getDoctype();
			if(null != docType){
				System.out.println("dtd 名称:"+docType.getName());
				System.out.println("dtd 公共标识符:"+docType.getPublicId());
				System.out.println("dtd 系统标识符:"+docType.getSystemId());
				System.out.println("dtd 内部子集:"+docType.getInternalSubset());
				System.out.println("============================");
				NamedNodeMap entities = docType.getEntities();
				int len = entities.getLength();
				for(int i=0;i<len;i++){
					Entity entity = (Entity)entities.item(i);
					System.out.println("实体名称:"+entity.getNodeName());
					System.out.println("记号名称:"+entity.getNotationName());
					System.out.println("实体公共标识符:"+entity.getPublicId());
					System.out.println("实体系统标识符:"+entity.getSystemId());
					System.out.println("============================");
				}
				NamedNodeMap notations = docType.getNotations();
				len = notations.getLength();
				for(int i=0;i<len;i++){
					Notation notation = (Notation)notations.item(i);
					System.out.println("记号名称:"+notation.getNodeName());
					System.out.println("记号公共标识符:"+notation.getPublicId());
					System.out.println("记号系统标识符:"+notation.getSystemId());
					System.out.println("============================");
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    firefox DOM Inspector 火狐 dom 查看器插件 天涯浪子

    DOM Inspector是Mozilla Firefox的一个扩充套件,官方中文版上称之为DOM观察器,在安装Mozilla Firefox时,可以在自订安装中选择是否安装DOM Inspector,如果在安装Mozilla Firefox时没有选择自订安装以安装DOM ...

    dom4j-2.1.1-API文档-中文版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    dom4j-2.1.1-API文档-中英对照版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    删除DOM节点 删除DOM节点

    删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点...

    资源jar包dom4j-1.6.1.rar

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    vue如何判断dom的class

    vue点击给dom添加class然后获取含有class的dom (item,index2) key=index2 ref=chosebox&gt; &lt;p&gt;{{item.name}} &lt;dt v-for=(item2,index) in item.childsCurGoods :key=item2.id :class=index==iac[index2]?'check'...

    DOM编辑器用于JSP

    DOM是一种独立于语言和平台的XML解析模型。给出了支持DOM核心模型和多种DOM扩展规范的XML编辑器ONCEXMLEditor的实现。ONCEXMLEditor具有高效的XML验证和序列化性能,同时提供给用户多种功能,包括按需遍历文档、提供上...

    HTML DOM基础教程(网页形式)

    DOM 首页 DOM 简介 DOM 节点 DOM 节点树 DOM 节点访问 DOM 节点信息 DOM How To DOM 参考 DOM 总结 DOM 实例 DOM 实例 DOM 对象 DOM Window DOM Navigator DOM Screen DOM History DOM Location DOM ...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    DOM4J jar包 所有的包 xml解析 dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1 导入直接使用

    JavaEE源代码 dom4j-1.6.1

    JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源...

    JavaScript DOM编程艺术(中文第2版)

    第1章 JavaScript简史 1.1 JavaScript的起源 1.2 DOM 1.3 浏览器战争 1.3.1 DHTML 1.3.2 浏览器之间的冲突 1.4 制定标准 1.4.1 浏览器以外的考虑 1.4.2 浏览器战争的结局 1.4.3 崭新的起点 1.5 小结 第2章 ...

    Dom4j_使用简介

    Dom4j_使用简介DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义: Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java ...

    使用dom4j 和本地dom 解析xml 文件

    使用dom4j 和本地dom 解析xml 文件

    dom4j_dom4j1.6.1安装包_

    maven dom4j 1.6.1安装包

    dom4j-1.6.1 + w3cschool.CHM离线帮助文档

    dom4j 目录的介绍: 1)docs 是文档目录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 2)lib 目录 3)src 目录是第三方类库的源码目录: 可进我的博客看文章 javaweb-05xml 第三节部分 早期 JDK 为我们提供了两种 ...

    Dom4j 1.6.1 JAVA API

    dom4j帮助文档 官方API All Classes Packages org.dom4j org.dom4j.bean org.dom4j.datatype org.dom4j.dom org.dom4j.dtd org.dom4j.io org.dom4j.jaxb org.dom4j.rule org.dom4j.rule.pattern org.dom...

    xml 三种解析方式dom,sax,dom4j

    xml 三种解析方式dom,sax,dom4j 内涵jar包,xml我默认放在本地D盘的。 三种方式的代码,我自己看别人代码总结。

    dom4j dom4j dom4j dom4j

    dom4j dom4j dom4j dom4j dom4j dom4j

    dom手册,js dom api,java dom api

    dom api手册,javascript dom,js dom,java dom

    dom4j-1.6.1 与 dom4j-2.0.0-ALPHA

    dom4j-1.6.1.zip与 dom4j-2.0.0-ALPHA-2.jar

Global site tag (gtag.js) - Google Analytics