books.XML文件:

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book id="1">
        <name>冰与火之歌</name>
        <author>乔治马丁</author>
        <price>88.0</price>
        <year>2014</year>
    </book>
    <book id="2">
        <name>安徒生童话</name>
        <price>77.0</price>
        <language>English</language>
    </book>
</bookstore>

把这个文档放在项目的根路径下,与src目录平行,就可以使用相对路径来引用了。

Java代码部分:

public class DOMTest {
    public static void main(String[] args) {

   // step 1:获得DOM解析器工厂

   // 工厂的作用是创建具体的解析器,即创建一个DocumentBuilderFactory对象
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        try {
            // step 2:获得具体的dom解析器   创建一个DocumentBuilder对象
            DocumentBuilder db=dbf.newDocumentBuilder();
            // step 3:解析一个xml文档,通过Document对象的parse方法加载books.xml文件到当前目录下
            Document document=db.parse("books.xml");
            //获取所有book节点的集合
            NodeList booklist= document.getElementsByTagName("book");
            //遍历每一个book节点
           //  通过getLength()获取NodeList的长度
            for(int i=0;i<booklist.getLength();i++){
                System.out.println("下面开始遍历第"+(i+1)+"本书");
            //    节点有多个属性时:
                //通过item(i)获取bookList的节点值,NodeList索引值从0开始
                Node book=booklist.item(i);
                //获取book的所有属性
                NamedNodeMap attrs= book.getAttributes();
                for(int j=0;j<attrs.getLength();j++){
                    //通过item(index)方法获取book节点的某一个属性
                    Node attr=attrs.item(j);
                    //获取属性名
                    System.out.println("属性名:"+attr.getNodeName());
                    //获取属性值
                    System.out.println("属性值:"+attr.getNodeValue());
                }
                //当知道节点只有一个id属性时:
                /*Element attr= (Element) booklist.item(i);
                String attributeValue=attr.getAttribute("id");
                System.out.println("id属性的属性值为:"+attributeValue);*/
                
                //下面解析book节点的子节点
                NodeList childNodes = book.getChildNodes();
                System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
                //获取每个节点的节点名和节点值
                for(int k=0;k<childNodes.getLength();k++){
                    //区分出text类型的node及element类型的node
                    if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
                        //获取了element类型的节点的节点名
                        System.out.print("第"+(k+1)+"个子节点的节点名称是:"+childNodes.item(k).getNodeName());
                        //两者之间的区别是Element类型的节点值为空
                        System.out.println("------"+childNodes.item(k).getFirstChild().getNodeValue());
                  //   System.out.println("------"+childNodes.item(k).getTextContent());
                    }
                }
            }
            System.out.println("===============循环结束==============");
        } 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();
        }
    }
}

具体过程参见注释。

首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象。 

我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。

又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。

  所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象

  这个对象代表了具体的DOM解析器。

  解析器的具体实现对于程序来说并不重要。  

  然后,我们就可以利用这个解析器对文档进行解析了。

  Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。

DOM方式解析XML文件实例的更多相关文章

  1. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  2. 在iOS 开发中用GDataXML(DOM方式)解析xml文件

    因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...

  3. Java-Web DOM方式解析xml文件

    XML DOM 树形结构: DOM 节点 根据 DOM,XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 元素是一个元素节点 包含在 XML 元素中 ...

  4. Java&Xml教程(二)使用DOM方式解析XML文件

    DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...

  5. SAX方式解析XML文件实例

    books.XML文件: 书籍book.java实体类: public class Book { private String id; private String name; private Str ...

  6. dom方式解析xml文件的步骤

    使用java类即可

  7. 用DOM方式解析XML

    一.用DOM方式解析XML 此例子节点结构如下: 1.获取book节点属性 (1).如果不知道节点的属性,通过 NamedNodeMap attrs = book.getAttributes(); 来 ...

  8. Dom方式解析XML

    public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...

  9. Java眼中的XML--文件读取--1 应用DOM方式解析XML

    初次邂逅XML: 需要解析的XML文件: 这里有两个book子节点. 1.如何进行XML文件解析前的准备工作,另外解析先获取book节点. 这个我后来看懂了: 这个Node的ELEMENT_NODE= ...

随机推荐

  1. 转载ASP.NET MVC 和ASP.NET Web Form简单区别

    转载原地址 http://www.cnblogs.com/lei2007/p/3315431.html 概论: Asp.net  微软 提供web开发框架或者技术.分Web Form和ASP.NET  ...

  2. 射频识别技术漫谈(12)——三次相互认证【worldsing笔记】

    射频识别系统中由于卡片和读写器并不是固定连接为一个不可分割的整体,二者在进行数据通讯前如何确信对方的合法身份就变得非常重要.根据安全级别的要求不同,有的系统不需认证对方的身份,例如大多数的TTF模式的 ...

  3. C++学习笔记(十五):异常

    C++之父Bjarne Stroustrup在<The C++ Programming Language>中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和 ...

  4. 剑指OFFER之字符串的排列(九度OJ1369)

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...

  5. mac下8080端口到80端口的转发

    MAC OS 本质上还是 Unix 系统, Unix 系统大多默认情况下非root用户是无法使用小于1024的常用端口的.这时候如果你开发中需要在普通用户下用到80端口, 比如 tomcat, 比如 ...

  6. 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND

    控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...

  7. Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)

    随着 Android 系统的应用和游戏越来越丰富,甚至有些比起Windows.Mac上的软件更加好用好玩,因此很多人都希望能在电脑上也能玩到安卓的游戏或APP. 我们曾推荐过 BlueStacks,而 ...

  8. MyEclipse设置默认的目光格式

    首先,选择菜单 windows-->preference Java-->Code Style-->Code Templates code-->new Java files 然后 ...

  9. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  10. 用linq实现登陆功能

    BLL层的逻辑代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...