使用dom解析

来源:互联网 发布:张佳玮nba知乎 编辑:程序博客网 时间:2024/05/18 03:22

什么是DOM和SAX ?
DOM Document Object Model —– 文档对象模型
DOM思想: 将整个xml 加载内存中,形成文档对象,所有对xml操作都对内存中文档对象进行
DOM 是官方xml解析标准
使用xml 存储和传输数据
1、通过程序生成xml
2、读取xml 中数据 —- xml 解析

1、创建 xml 文档 books.xml
在企业实际开发中,为了简化xml 生成和解析 —- xml 数据文件通常不使用约束的
2、使用DOM解析xml 将整个xml文档加载到内存中 : 工厂 — 解析器 — 解析加载
3、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合

DOM 编程思路小结
1,decumentBuliderFactory decumentbuilderfactory=decumentBuliderFactory.newinstance();
2.Document document=decumentbuilderfactory.parse();//装载XML文档 —- Document
3.Document 获得指定元素 —– getElementsByTagName (返回 NodeList)
Nodelist nodelist=document.getElementsByTagName(“标签名”)
4、遍历NodeList 获得 每个 Node
5、将每个Node 强制转换 Element
5、通过元素节点API 操作属性和文本内容
getAttribute 获得属性值
getTextContent 获得元素内部文本内容

首先我们必须创建xml文档,在这里,我们先创建了一个value的文件夹,然后在里面创建了Newfile.xml文档
其次创建java代码,
xml文档内容如下

<?xml version="1.0" encoding="UTF-8"?><books>  <book>        <name> 高效java </name>        <pirce>50 </pirce>    </book>    <book>        <name>  java编程思想  </name>            <pirce> 80  </pirce>    </book></books>

//java代码如下

package com.effective_java;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class Model5 {    public static void main(String[] args) {        // TODO 自动生成的方法存根        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();//定义工厂api使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。         try {            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();            //使用当前配置的参数创建一个新的 DocumentBuilder 实例。            Document document = documentBuilder.parse("value\\NewFile.xml");        //定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document。        //在这里,我们通过url创建        NodeList nodelist = document.getElementsByTagName("name");//按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。            for (int i = 0; i < nodelist.getLength(); i++) {//对nodellist进行遍历                Node node = nodelist.item(i);// 返回集合中的每一个项               Element element=(Element)node;//将node强转为element对象               element.gettextcontent();//获得标签内容            }                        // 下面我们查找java编程基础的价格            nodelist = document.getElementsByTagName("book");            for (int i = 0; i < nodelist.getLength(); i++) {                Element element = (Element) nodelist.item(i);                System.out.println(element.getTextContent());                if (element.getTextContent().equals("java编程思想")) {                    // 说明我们找到了这本书,在xml中我们发现价格是book的第四个节点(回车换行也是子节点)                    element = (Element) nodelist.item(3);                    System.out.println(element.getTextContent());                }                  /*           * 这里面我们使用最常见的api就是 getElementsByTagName();通过节点的名称,我们可以           * 获得一个节点的nodelist,这个nodelist是一个节点的集合           * 通过getItem我们就可以得到具体的NOde对象           *            *为了我更好的理解,我们将xml改写如下           *//** <books>  <book>        <name> 高效java </name>        <pirce>50 </pirce>    </book>    <book>        <name>  java编程思想  </name>            <pirce> 80  </pirce>    </book>    <book>    <name type="计算机">深入了解java虚拟机</name>      <price>60</price>      <author>      <name>周志明</name>      <address>母鸡</address>          </author>    </book></books>             */ //获得java虚拟机的作者的名字           /*            * 分析:是name节点的子节点的孩子节点            */            Node node;            NodeList child;            Node Node1;            //NodeList nodelist3;            NodeList nodeList2=document.getElementsByTagName("name");     for(int i=0;i<nodeList2.getLength();i++){           node=nodeList2.item(i);           if(node.getTextContent().equals("深入了解java虚拟机")){               System.out.println("正确");                Node1= node.getNextSibling().getNextSibling().getNextSibling().getNextSibling();                child=Node1.getChildNodes();                for(i=0;i<child.getLength();i++){                    node=child.item(i);                    if(node.getNodeName().equals("name")){                        System.out.println(node.getTextContent());                    }                }                     }     }       System.out.println(document.getAttributes());//属性       System.out.println(document.getBaseURI());//xml文件的地址       System.out.println(document.getNodeName());//节点名称       //Element和Node节点相同       //node=(Element)child.item(0);       //document.getDocumentElement();可以直接获得文档元素的子节点       System.out.println(document.getDocumentElement().getNodeName());        } catch (Exception e) {            // TODO 自动生成的 catch 块            e.printStackTrace();        }    }}

**
//首先我们说明一下这几个类,
/*
DocumentBuilderFactory
定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。
通过工厂我们可以拿到
DocuemtnBuilder实例
对于DocumentBuilder类,我们来看一下简介:
定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document。
此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。获取此类的实例之后,
将可以从各种输入源解析 XML。这些输入源有 InputStreams、Files、URL 和 SAX InputSources。
注意,此类重用了 SAX API 中的一些类。这并不要求底层 DOM 实现的实现者使用 SAX 解析器将 XML 文档解析为 Document。
它仅要求该实现使用这些现有的 API 与应用程序交流。
DocumentBuilder获得Document对象有五种方式
当然我们在使用解析式是对文件解析,所以使用 Document parse(File f);

重点我们去看看Document类
文档的解释如下
Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。
因为元素、文本节点、注释、处理指令等不能存在于 Document 的上下文之外,所以 Document 接口还包含所需的创建这些对象的工厂方法。所创建的 Node 对象具有 ownerDocument 属性,该属性将 Node 对象与创建这些对象时的上下文所属的 Document 关联起来。
从这里我们可以看出Document提供了对html和xml文件节点的访问,同时提供了大量的api支持我们的操作
这就是最简单的实现方式
当时希望大家注意解析的方式是可以解析换行的,默认换行也是一个节点
在这里我们重点关注一下Node类和NodeLisst类的几个方法
NOde的几个重要的方法
getFirstChild() 此节点的第一个子节点。
getLastChild() 获得最后一个子节点
getAttributes() 获得节点属性
getChildNodes() 获得孩子节点返回Nodelist
getNextSibling() 获得下一个节点
getNodeValue() 获得节点的值
等等都能帮助我们查找指定的xml属性或节点
具体的自己大家查看api

    再来看看Nodelist类中常见的方法getLength()   列表中的节点数。 item(int index)  返回节点    就两个api,这个就不用说明了 */

**

原创粉丝点击