java xml Dom
概述
DOM解析是将XML文件全部载入到内存,组装成一颗DOM树,然后通过节点以及节点之间的关系来解析XML文件。
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
Java中除了DOM方法可以解析XML文件外,还可以使用SAX、JDOM、DOM4J等方法
步骤
1、创建解析器工厂对象 DocumentBuildFactory对象
2、由解析器工厂对象创建解析器对象,即DocumentBuilder对象
3、由解析器对象对指定XML文件进行解析,构建相应的DOM树,创建Document对象,生成一个Document对象
4、以Document对象为起点对DOM树的节点进行查询
5、使用Document的getElementsByTagName方法获取元素名称,生成一个NodeList集合,
6、遍历集合
常用类
DocumentBuilderFactory
public abstract class DocumentBuilderFactory extends Object
- 概述
使应用程序能够从XML文档获取生成DOM对象树的解析器。
-
方法
static DocumentBuilderFactory newInstance()
获得一个新的一个
DocumentBuilderFactory
实例。
DocumentBuilder
public abstract class DocumentBuilder extends Object
- 概述
定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document
。
- 常用方法
abstract Document newDocument()
获取DOM的新实例Document对象来构建一个DOM树。
Document parse(File f)
将给定文件的内容解析为XML文档,并返回一个新的DOM Document对象。 abstract
Document parse(InputSource is)
将给定输入源的内容解析为XML文档,并返回一个新的DOM Document对象。
Document parse(InputStream is)
将给定的InputStream的内容解析为XML文档,并返回一个新的DOM Document对象。
Document parse(InputStream is, String systemId)
将给定的InputStream的内容解析为XML文档,并返回一个新的DOM Document对象。
Document parse(String uri)
将给定URI的内容解析为XML文档,并返回一个新的DOM Document对象。
Document
public interface Document extends Node
- 概述
Document
接口代表整个HTML或XML文档。在概念上,它是文档树的根,并提供对文档数据的主访问。
由于元素,文本节点,注释,处理指令等不能存在于Document
的上下文Document
, Document
接口还包含创建这些对象所需的工厂方法。 创建的Node
对象具有ownerDocument
属性,它们与创建的上下文中的Document
。
-
常用方法
Attr createAttribute(String name) 创建给定名称的 Attr 。
Comment createComment(String data) 创建给定指定字符串的 Comment节点。
Element createElement(String tagName) 创建指定类型的元素。
Text createTextNode(String data) 创建给定指定字符串的 Text节点。
Element getElementById(String elementId)
返回 Element具有与给定值的ID属性。
NodeList getElementsByTagName(String tagname)
以文件顺序返回 NodeList所有 Elements的给定标签名称,并包含在文档中。
NodeList getElementsByTagNameNS(String namespaceURI, String localName)
返回 NodeList的所有 Elements具有给定本地名称和命名空间URI在文档顺序。
NodeList
public interface NodeList
- 概述
NodeList接口提供了节点的有序集合的抽象,而不定义或约束如何实现该集合。 NodeList DOM中的对象是活的。
NodeList中的项目可以通过整数索引访问,从0开始。
-
常用方法
int getLength() 列表中的节点数。
Node item(int index) 返回 index中的index项。
Node
public interface Node
- 概述
Node
接口是整个文档对象模型的主数据类型。它表示文档树中的单个节点。虽然实现Node
接口的所有对象都公开了处理子对象的方法,但并不是所有实现Node接口的Node
都可能有子节点。例如, Text
节点可能没有子节点,并且向这些节点添加子节点导致DOMException
被引发。
属性nodeName
, nodeValue
和attributes
包括作为一种机制来获取节点信息,而无需拆毁到特定的派生接口。 如果对于特定的nodeType
(例如, nodeValue
的Element
或attributes
的Comment
)没有明确的映射,则返回null
。 请注意,专用接口可能包含附加和更方便的机制来获取和设置相关信息。
-
常用方法
Node appendChild(Node newChild) 将节点 newChild添加到此节点的子节点列表的末尾。
NamedNodeMap getAttributes()
A NamedNodeMap包含此节点的属性(如果是 Element )或 null否则。NodeListgetChildNodes() NodeList包含此节点的所有子节点。
Node getFirstChild() 这个节点的第一个孩子。
Node getLastChild() 这个节点的最后一个孩子。String getNodeName() 该节点的名称取决于其类型; 见上表。
short getNodeType() 代表基础对象的类型的代码,如上所定义。
String getNodeValue() 该节点的值取决于其类型; 见上表。
Document getOwnerDocument() 与此节点相关 Document对象。
Node getParentNode() 这个节点的父节点。Node removeChild(Node oldChild) 通过删除指定的子节点 oldChild儿童的名单,并将其返回。
boolean hasAttributes() 返回此节点(如果它是一个元素)是否具有任何属性。
Attr
public interface Attr extends Node
- 概述
Attr
接口表示Element
对象中的属性。 通常,属性的允许值在与文档关联的模式中定义。
- 常用方法
String getName() 返回此属性的名称。
Element getOwnerElement() Element此属性附加的节点或 null如果此属性未使用。
TypeInfo getSchemaTypeInfo()
与此属性相关联的类型信息。
boolean getSpecified() True如果这个属性在实例文档中被明确赋予了一个值, false否则。
String getValue() 在检索时,属性的值作为字符串返回。
booleanis Id() 返回此属性是否已知为类型ID(即
void setValue(String value) 在检索时,属性的值作为字符串返回。
Comment
public interface Comment extends CharacterData
- 概述
该接口继承自CharacterData
并表示注释的内容,即起始’ '和结束'
–>'之间的所有
–>` 。请注意,这是XML中的注释的定义,而在实践中,HTML,虽然一些HTML工具可能会实现完整的SGML注释结构。
对注释的内容没有进行词法检查,因此可以在内容中具有字符序列"--"
(双连字符),这在[ XML 1.0 ]的第2.5节的评论中是非法的。 在序列化期间,此字符序列的存在必须产生致命错误。
-
常用方法
Node
appendChild, cloneNode, compareDocumentPosition, getAttributes, getBaseURI, getChildNodes, getFeature, getFirstChild, getLastChild, getLocalName, getNamespaceURI, getNextSibling, getNodeName, getNodeType, getNodeValue, getOwnerDocument, getParentNode, getPrefix, getPreviousSibling, getTextContent, getUserData, hasAttributes, hasChildNodes, insertBefore, isDefaultNamespace, isEqualNode, isSameNode, isSupported, lookupNamespaceURI, lookupPrefix, normalize, removeChild, replaceChild, setNodeValue, setPrefix, setTextContent, setUserData
Element
public interface Element extends Node
- 概述
Element
接口表示HTML或XML文档中的元素。 元素可以具有与它们相关联的属性; 由于Element
接口从继承Node
,通用Node
接口属性attributes
可以用于检索集合为一个元件的所有属性的。 Element
接口上有一些方法可以通过名称检索一个Attr
对象,或者按名称检索一个属性值。 在XML中,属性值可能包含实体引用,应Attr
对象以检查表示属性值的可能相当复杂的子树。 另一方面,在HTML中,所有属性都具有简单的字符串值,可以方便地使用直接访问属性值的方法。
- 常用方法
String getAttribute(String name)
按名称检索属性值。
Attr getAttributeNode(String name)
按名称检索属性节点。
Attr getAttributeNodeNS(String namespaceURI, String localName)
通过本地名称和命名空间URI Attr节点。
String getAttributeNS(String namespaceURI, String localName)
通过本地名称和命名空间URI检索属性值。
NodeList getElementsByTagName(String name)
返回 NodeList所有子孙的 Elements具有给定标记名称,在文档顺序。
NodeList getElementsByTagNameNS(String namespaceURI, String localName)
返回 NodeList所有后代的 Elements具有给定本地名称和命名空间URI在文档顺序。
TypeInfo getSchemaTypeInfo()
与该元素相关联的类型信息。
String getTagName()
元素的名称。
boolean hasAttribute(String name)
返回 true在此元素上被指定给定名称的属性或具有默认值, false其他。
boolean hasAttributeNS(String namespaceURI, String localName)
返回 true在此元素上被指定或具有默认值,与给定的本地名称和命名空间的属性URI false其他。
void removeAttribute(String name)
按名称删除属性。
Attr removeAttributeNode(Attr oldAttr)
删除指定的属性节点。
void removeAttributeNS(String namespaceURI, String localName)
通过本地名称和命名空间URI删除属性。 voidsetAttribute(String name, String value)
添加一个新属性。
Attr setAttributeNode(Attr newAttr)
添加一个新的属性节点。
Attr setAttributeNodeNS(Attr newAttr)
添加一个新属性。
void setAttributeNS(String namespaceURI, String qualifiedName, String value)
添加一个新属性。
void setIdAttribute(String name, boolean isId)
如果参数 isId为 true ,则此方法将指定的属性声明为用户确定的ID属性。
void setIdAttributeNode(Attr idAttr, boolean isId)
如果参数 isId为 true ,则此方法将指定的属性声明为用户确定的ID属性。
void setIdAttributeNS(String namespaceURI, String localName, boolean isId)
如果参数 isId为 true ,则此方法将指定的属性声明为用户确定的ID属性。
Text
public interface Text extends CharacterData
- 概述
所述Text
接口从继承CharacterData
和表示文本内容(称为character data一个在XML) Element
或Attr
。如果元素内容中没有标记,则该文本包含在实现Text接口的单个对象中,该Text
是该元素的唯一子元素。如果有标记,则将其分解为形成元素子元素列表的信息项(元素,注释等)和Text
节点。
当文档首先通过DOM Text
,每个文本块只有一个Text
节点。 用户可以创建表示给定元素的内容的邻近的Text
节点,而不需要任何中间标记,但是应该意识到无法在XML或HTML中表示这些节点之间的分离,因此它们不会(通常)在DOM编辑会话。 Node.normalize()
方法将任何此类相邻的Text
对象合并到每个文本块的单个节点中。
没有对Text
节点的内容进行词法检查,根据文档的位置,在使用字符引用的序列化过程中必须转义一些字符; 例如字符“<&”,如果文本内容是元素或属性的一部分,字符序列“]]>”当元素的一部分,引号字符或撇号字符“当属性的一部分时。
-
常用方法
Node
appendChild, cloneNode, compareDocumentPosition, getAttributes, getBaseURI, getChildNodes, getFeature, getFirstChild, getLastChild, getLocalName, getNamespaceURI, getNextSibling, getNodeName, getNodeType, getNodeValue, getOwnerDocument, getParentNode, getPrefix, getPreviousSibling, getTextContent, getUserData, hasAttributes, hasChildNodes, insertBefore, isDefaultNamespace, isEqualNode, isSameNode, isSupported, lookupNamespaceURI, lookupPrefix, normalize, removeChild, replaceChild, setNodeValue, setPrefix, setTextContent, setUserData
例子
实例化一个文档构建器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通过文档构建器工厂获取一个文档构建器
DocumentBuilder builder = factory.newDocumentBuilder();
//通过文档通过文档构建器构建一个文档实例
Document document = builder.parse(new File("dom.xml"));
//返回 NodeList所有的 Elements文档顺序与给定的标签名称,包含在文档中
// NodeList中的项目可以通过整数索引访问,从0开始。
NodeList nodeList = document.getElementsByTagName("persons");
// Node接口的Node都可能有子节点。 例如, Text节点可能没有子节点,并且向这些节点添加子节点导致DOMException被引发。
int len = nodeList.getLength();
for (int i=0;i<len;i++) {
Node item = nodeList.item(i);
NodeList childNodes = item.getChildNodes();
int childlen = childNodes.getLength();
for (int j=0;j<childlen;j++){
Node item1 = childNodes.item(j);
NodeList childNodes1 = item1.getChildNodes();
int length = childNodes1.getLength();
for (int z=0;z<length;z++){
Node item2 = childNodes1.item(z);
System.out.println(item2.getLocalName() +"=>" +item2.getNodeValue());
}
}
}
}