public
DOMImplementation getImplementation();
对
DOMImplementation
接口,它提供了一些和
DOM
节点无关的操作:
public
interface
DOMImplementation {
public
boolean
hasFeature(String feature, String version);
public
DocumentType createDocumentType(String qualifiedName,
String publicId, String systemId);
public
Document createDocument(String namespaceURI, String qualifiedName,
DocumentType doctype);
public
Object getFeature(String feature, String version);
每个
XML
文件都可以指定编码类型、
standalone
属性、
XML
版本、是否执行严格的语法检查、
Document
的位置:
public
String getInputEncoding();
public
String getXmlEncoding();
public
boolean
getXmlStandalone();
public
void
setXmlStandalone(
boolean
xmlStandalone);
public
String getXmlVersion();
public
void
setXmlVersion(String xmlVersion);
public
boolean
getStrictErrorChecking();
public
void
setStrictErrorChecking(
boolean
strictErrorChecking);
public
String getDocumentURI();
public
void
setDocumentURI(String documentURI);
Document
提供了创建其他所有节点类型的工厂方法,并且支持带命名空间的
Element
、
Attr
的创建:
public
Element createElement(String tagName);
public
Element createElementNS(String namespaceURI, String qualifiedName);
public
Attr createAttribute(String name);
public
Attr createAttributeNS(String namespaceURI, String qualifiedName);
public
DocumentFragment createDocumentFragment();
public
Text createTextNode(String data);
public
Comment createComment(String data);
public
CDATASection createCDATASection(String data);
public
ProcessingInstruction createProcessingInstruction(String target, String data);
public
EntityReference createEntityReference(String name);
查找
Element
节点
1.
通过
ID
属性查找:
public
Element getElementById(String elementId);
2.
使用标签名查找:
public
NodeList getElementsByTagName(String tagname);
3.
使用命名空间
URI
和本地标签名:
public
NodeList getElementsByTagNameNS(String namespaceURI, String localName);
其中
NodeList
接口提供了遍历
Node
的操作:
public
interface
NodeList {
public
Node item(
int
index);
public
int
getLength();
配置与规格化
如
Node.normalize()
,
Document
也定义自己的
normalizeDocument()
,它根据当前的配置规格化
DOM
树(替换
EntityReference
成
Entity
,合并相邻的
Text
节点等),如果配置验证信息,在操作同时还会验证
DOM
树的合法性。
Document
可以通过
DOMConfiguration
接口实例配置:
public
DOMConfiguration getDomConfig();
public
interface
DOMConfiguration {
public
void
setParameter(String name, Object value);
public
Object getParameter(String name);
public
boolean
canSetParameter(String name, Object value);
public
DOMStringList getParameterNames();
如设置
validate
属性:
DOMConfiguration docConfig = myDocument.getDomConfig();
docConfig.setParameter("validate", Boolean.TRUE);
其中
DOMStringList
提供了遍历
String List
的操作,类似
NodeList
:
public
interface
DOMStringList {
public
String item(
int
index);
public
int
getLength();
public
boolean
contains(String str);
public
Node importNode(Node importedNode,
boolean
deep);
向当前
Document
中导入存在于另一个
Document
中的节点而不改变另一个
Document
中
DOM
树的结构。
public
Node adoptNode(Node source);
向当前
Document
中加入存在于另一个
Document
中的节点,并将该节点从另一个
Document
中移除。
public
Node renameNode(Node n, String namespaceURI, String qualifiedName);
重命名一个
Element
或
Attr
节点
Element
接口
Element
节点表示
XML
文件中的一个标签,因而它最常用。由于在所有节点类型中,只有
Element
节点可以包含书,因而所有和属性具体相关的操作都定义在
Element
接口中:
public
String getAttribute(String name);
public
void
setAttribute(String name, String value);
public
void
removeAttribute(String name);
public
Attr getAttributeNode(String name);
public
Attr setAttributeNode(Attr newAttr)
public
Attr removeAttributeNode(Attr oldAttr);
public
String getAttributeNS(String namespaceURI, String localName);
public
void
setAttributeNS(String namespaceURI, String qualifiedName, String value);
public
void
removeAttributeNS(String namespaceURI, String localName);
public
Attr getAttributeNodeNS(String namespaceURI, String localName);
public
Attr setAttributeNodeNS(Attr newAttr)
;
public
boolean
hasAttribute(String name);
public
boolean
hasAttributeNS(String namespaceURI, String localName);
public
void
setIdAttribute(String name,
boolean
isId);
public
void
setIdAttributeNS(String namespaceURI, String localName,
boolean
isId)
;
public
void
setIdAttributeNode(Attr idAttr,
boolean
isId);
Element
还提供了两个使用标签名查找子
Element
方法以及返回当前
Element
的标签名方法,该标签名为包含命名空间前缀的全名:
public
NodeList getElementsByTagName(String name);
public
NodeList getElementsByTagNameNS(String namespaceURI, String localName);
public
String getTagName();
Attr
接口
Attr
节点表示
Element
节点中的一个属性,一般一个
Element
中存在什么样的属性会在相应的
Schema
或
DTD
中定义。虽然
Attr
继承自
Node
接口,但是它并不属于
Element
节点的子节点,因而它不属于
DOM
树中的节点,它只存在于
Element
节点中,所以它的
parentNode
、
previousSibling
、
nextSibling
的值都为
null
。然而
Attr
可以存在子节点,它的子节点可以是
Text
节点或
EntityReference
节点。
对在
Schema
中有默认值定义的
Attr
,移除和初始化时会新创建一个
Attr
,它的
specified
属性为
false
,值为
Schema
中定义的默认值。在调用
Document.normalizeDocument()
方法时,所有
specified
属性为
false
的
Attr
值都会重新计算,如果它在
Schema
中没有默认值定义,则该
Attr
会被移除。
属性是具有
Name
和
Value
的值对,其中创建一个
Attr
实例后,
Name
不可以改变,要改变则需要创建新的
Attr
实例,而
Value
值可以改变。
specified
属性表明该属性的值是用户设置的(
true
)还是
Schema
中默认提供的。
id
属性表明该
Attr
是不是其所属
Element
的
id
属性,一个
id
属性的值可以在一个
Document
中唯一的标识一个
Element
。由于所有
Attr
都是基于
Element
的,因而可以获取其所属的
Element
。
public
interface
Attr
extends
Node {
public
String getName();
public
boolean
getSpecified();
public
String getValue();
public
void
setValue(String value);
public
Element getOwnerElement();
public
TypeInfo getSchemaTypeInfo();
public
boolean
isId();
DocumentType
接口
每个
Document
都有
doctype
属性,它包含了
DTD
文件信息(位置、文件名等),同时它还提供了读取
DTD
文件中定义的
Entity
、
Notation
的集合,即它是对
XML
文件中以下语句的封装:
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>
name
为
beans
publicId
为
-//SPRING//DTD BEAN//EN
systemId
为
http://www.springframework.org/dtd/spring-beans.dtd
entities
、
notations
为该
DTD
文件中定义的
Entity
和
Notation
的集合
public
interface
DocumentType
extends
Node {
public
String getName();
public
NamedNodeMap getEntities();
public
NamedNodeMap getNotations();
public
String getPublicId();
public
String getSystemId();
public
String getInternalSubset();
ProcessingInstruction
接口
在
XML
文件中还可以定义一些指令以供一些解析器使用该信息对该文件做正确的处理,在
DOM
中使用
ProcessingInstruction
接口对该定义进行抽象:
<?
xml-stylesheet
href
=
"show.css"
type
=
"text/css"
?>
ProcessingInstruction
额外定义了两个属性:
target
和
data
:
target
为
xml-stylesheet
data
为
href
=
"show.css"
type
=
"text/css"
public
interface
ProcessingInstruction
extends
Node {
public
String getTarget();
public
String getData();
public
void
setData(String data);
CharacterData
接口
CharacterData
接口继承自
Node
接口,它是所有字符相关节点的父接口,定义了所有字符相关的操作:定义属性、添加、插入、删除、替换、取子串等。
public
interface
CharacterData
extends
Node {
public
String getData();
public
void
setData(String data);
public
int
getLength();
public
String substringData(
int
offset,
int
count);
public
void
appendData(String arg);
public
void
insertData(
int
offset, String arg);
public
void
deleteData(
int
offset,
int
count);
public
void
replaceData(
int
offset,
int
count, String arg);
Text
接口
Text
接口继承自
CharacterData
接口,它表示文本节点,一般作为
Element
、
Attr
的子节点,而它本身没有子节点。
Text
定义了一个文本节点,如
Element
的文本
Content
或
Attr
的值。若文本里面包含特殊字符(如
’<’, ‘>’
等)需要转义。在操作
DOM
树时,用户可以插入多个
Text
节点,在
Node.normalize()
处理时会合并两个各相邻的
Text
节点。
Text
节点提供了除对字符数据操作的其他额外操作:
splitText()
:
Text
节点分割成两个相邻的
Text
节点,即新分割出的
Text
节点为之前
Text
节点的兄弟节点
isElementContentWhitespace()
:判断当前
Text
节点是否存在
Element Content Whitespace
,没读懂。
getWholeText()
:当存在多个相邻的
Text
节点时,该属性会返回所有相邻
Text
节点的值。
replaceWholeText()
:替换所有相邻
Text
节点为新设置的节点(可能是当前节点本身)。如果其中有一个节点无法移除(如包含
EntityReference
的节点),则会抛出
DOMException
。
public
interface
Text
extends
CharacterData {
public
Text splitText(
int
offset);
public
boolean
isElementContentWhitespace();
public
String getWholeText();
public
Text replaceWholeText(String content);
CDATASection
接口
CDATASection
接口继承自
Text
接口,它类似于
Text
节点,所不同的是所有的
CDATASection
节点都包含在
<![CDATA[“Content need not to be escaped”]]>
中,并且如果其内容包含特殊字符不需要转义。不同于
Text
节点,在
Node.normalize()
阶段,相邻的两个
CDATASection
节点不会被合并。
public
interface
CDATASection
extends
Text {
Comment
接口
Comment
接口继承自
CharacterData
接口,它是对
XML
文件中注释语句的抽象,它只包含注释的字符串信息,没有额外定义的行为:
public
interface
Comment
extends
CharacterData {
Entity
接口
Entity
接口是对一个实体定义的抽象,即它是对
DTD
文件中以下定义的抽象:
<!ENTITY
JENN
SYSTEM
"http://images.about.com/sites/guidepics/html.gif"
NDATA
gif
>
Entity
接口定义了
systemId
、
publicId
、
notationName
等信息,而对其他信息则在其子节点中显示,如
Entity
可能指向另一个外部文件,或者直接定义
Entity
的值(对这个,貌似我始终返回
null
,按网上的说法,这个是
xerces
的
bug
),如以下定义:
<!ENTITY
name
"cnblog"
>
<!ENTITY
copyright
SYSTEM
"copyright.desc"
>
另外
Entity
还定义了一些编码和
XML
版本的信息:
public
interface
Entity
extends
Node {
public
String getPublicId();
public
String getSystemId();
public
String getNotationName();
public
String getInputEncoding();
public
String getXmlEncoding();
public
String getXmlVersion();
EntityReference
接口
EntityReference
节点表示对一个
Entity
的引用。
public
interface
EntityReference
extends
Node {
Notation
接口
Notation
接口是对
DTD
中
Notation
定义的抽象:
<!NOTATION
gif
SYSTEM
"image/gif"
>
一个
Notation
包含
name
(
nodeName
)、
systemId
、
publicId
信息:
public
interface
Notation
extends
Node {
public
String getPublicId();
public
String getSystemId();
DocumentFragment
接口
DocumentFragment
是对
DOM
树片段的抽象,从而可以将部分
DOM
树节点作为一个集合来处理,如插入到一个
Document
中的某个节点中,实际插入的是
DocumentFragment
中所有的子节点。把
DOM
树的部分节点作为一个整体来看待部分可以通过
Document
来实现,然而在部分实现中,
Document
是一个重量级的对象,而
DocumentFragment
则可以保证它是一个轻量级的对象,因为它没有
Document
存在的那么限制,这也是
DocumentFragment
存在的原因。
DocumentFragment
的定义如下:
public
interface
DocumentFragment
extends
Node {