DOM
是
Document Object Model
的缩写,即文档对象模型,它是
W 3C
组织推荐的处理
XML
的标准接口。
2004
年
4
月
7
日
,
W 3C
组织发布了
DOM Level3 Core
的推荐标准,有关
DOM
的技术报告可以在
http://www.w3.org/DOM/DOMTR.html
上查看。
DOM
是用与平台和语言无关的方式表示
XML
文档的官方
W 3C
标准。
DOM
是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而
DOM
被认为是基于树或基于对象的。
DOM
以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像
SAX
那样是一次性的处理。
DOM
使用起来也要简单得多。
Dom
解析的一个简单例子:
1.
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://192.168.0.13:8080/logo.gif" NDATA gif>
<!ENTITY banner SYSTEM "http://192.168.0.13:8080/banner.gif" NDATA jpg>
2.
DocTypePrinter .java
代码:
package xml.dom;
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.w 3c .dom.DocumentType;
import org.w 3c .dom.Entity;
import org.w 3c .dom.NamedNodeMap;
import org.w 3c .dom.Notation;
import org.xml.sax.SAXException;
public class DocTypePrinter {
/**
* @param args
*/
public static void main(String[] args) {
new DocTypePrinter();
}
public DocTypePrinter() {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
org.w 3c .dom.Document doc = db.parse(new File("hr.xml"));//
创建一个文档节点
DocumentType dt = doc.getDoctype();//
获得文档类型属性
System.out.println("
文档类型公共标识符:
"+dt.getPublicId()+"\t
文档类型系统标识符:
"+dt.getSystemId());
System.out.println("
外部
DTD
文件的名称:
"+dt.getName());//
输出外部
DTD
文件的名字
NamedNodeMap entity = dt.getEntities();//
获得文档引用的实体节点
NamedNodeMap notation = dt.getNotations();//
获得文档中实体用到的记号节点
for (int i = 0; i < entity.getLength(); i++) {//
输出文档中引用的所有的实体信息
Entity en = (Entity) entity.item(i);
System.out
.println("
实体名:
" + en.getNodeName() + "
实体系统标识符:
"
+ en.getSystemId() + "
实体的记号名称:
"
+ en.getNotationName());
}
for (int i = 0; i < notation.getLength(); i++) {//
输出文档中引用的所有的记号信息
Notation no = (Notation) notation.item(i);
System.out.println("
记号的名称:
" + no.getNodeName() + "
记号的系统标识符:
"
+ no.getSystemId());
}
for (int i = 0; i < entity.getLength(); i++) {
Entity en = (Entity) entity.item(i);//
实体
if (en.getNotationName() != null)
for (int j = 0; j < notation.getLength(); j++) {
Notation no = (Notation) notation.item(j);//
实体的符号记号
if (en.getNotationName().equals(no.getNodeName())) {
String[] st = {
"C:\\Program Files\\Internet Explorer\\iexplore.exe",
en.getSystemId() };
Runtime.getRuntime().exec(st);//
用指定的程序运行该未解析的实体资源
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
如果那里不太清楚,请参考