java xml Dom

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的上下文DocumentDocument接口还包含创建这些对象所需的工厂方法。 创建的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被引发。

属性nodeNamenodeValueattributes包括作为一种机制来获取节点信息,而无需拆毁到特定的派生接口。 如果对于特定的nodeType (例如, nodeValueElementattributesComment )没有明确的映射,则返回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) ElementAttr 。如果元素内容中没有标记,则该文本包含在实现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());
                }

            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值