Java解析xml文件

在Java程序中读取xml文件的过程也称为“解析xml文件”;
解析的目的:
  • 获取 节点名和节点值
  • 获取 属性名、属性值。
四中解析方式:
  • DOM
  • SAX
  • DOM4J
  • JDOM
(其中DOM、SAX是官方提供的解析方式,不需要额外的jar包,后两种则需要)


例:DOM方式解析books.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
<book type="fiction" id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<year>2004</year>
<price>77</price>
<language>English</language>
</book>
</bookstore>
15
 
1
<?xml version="1.0" encoding="UTF-8" ?> 
2
<bookstore>
3
        <book type="fiction" id="1">
4
                <name>冰与火之歌</name>
5
                <author>乔治马丁</author>
6
                <year>2014</year>
7
                <price>89</price>
8
        </book>
9
        <book id="2">
10
                <name>安徒生童话</name>
11
                <year>2004</year>
12
                <price>77</price>
13
                <language>English</language>
14
        </book>
15
</bookstore>
以上是我们需要解析的xml文件,我们的目的是:通过Java获取xml文件的所有数据。

准备工作

准备工作:
  • (1)创建一个DocumentBuilderFactory对象
  • (2)创建一个DocumentBuilder对象
  • (3)通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
public class DomTest {
public static void main(String[] args) {
//(1)创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//(2)创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//(3)通过DocumentBuilder对象的parse方法加载book.xml
Document document = db.parse("books.xml"); } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
19
 
1
public class DomTest { 
2
    public static void main(String[] args) {
3
        //(1)创建DocumentBuilderFactory对象
4
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
5
        try {
6
            //(2)创建DocumentBuilder对象
7
            DocumentBuilder db = dbf.newDocumentBuilder();
8
            //(3)通过DocumentBuilder对象的parse方法加载book.xml
9
            Document document = db.parse("books.xml");
10

11
        } catch (ParserConfigurationException e) {
12
            e.printStackTrace();
13
        } catch (SAXException e) {
14
            e.printStackTrace();
15
        } catch (IOException e) {
16
            e.printStackTrace();
17
        }
18
    }
19
}

解析xml文件属性

解析属性:
  • (1)Document类来获取节点集合
  • (2)遍历节点集合
  • (3)通过item(i)获取节点Node
  • (4)通过Node的getAttributes获取节点的属性集合
  • (5)遍历属性
  • (6)获取属性和属性名

public class DomTest {
public static void main(String[] args) {
//创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parse方法加载book.xml
Document document = db.parse("books.xml"); //(1)获取所有book节点的集合
NodeList booklist = document.getElementsByTagName("book");
System.out.println("共有" + booklist.getLength() + "本书");
System.out.println("-------------------------------------"); //(2)遍历每个book节点
for (int i = 0; i < booklist.getLength(); i++) {
//(3)通过item(i)获取book节点,nodelist索引从0开始
Node book = booklist.item(i);
//(4)获取book节点的所有属性集合
NamedNodeMap attrs = book.getAttributes(); //获取属性的数量
System.out.println("第" + (i + 1) + "本书有" + attrs.getLength() + "个属性");
System.out.print("分别是:"); //(5)遍历book的属性
for (int j = 0; j < attrs.getLength(); j++) {
//(6)获取属性
Node att = attrs.item(j);
//(6)获取属性的名称
String attName = att.getNodeName();
System.out.print(attName + ", ");
}
System.out.println();
System.out.println("-------------------------------------");
} } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
47
 
1
public class DomTest { 
2
    public static void main(String[] args) {
3
        //创建DocumentBuilderFactory对象
4
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
5
        try {
6
            //创建DocumentBuilder对象
7
            DocumentBuilder db = dbf.newDocumentBuilder();
8
            //通过DocumentBuilder对象的parse方法加载book.xml
9
            Document document = db.parse("books.xml");
10

11
            //(1)获取所有book节点的集合
12
            NodeList booklist = document.getElementsByTagName("book");
13
            System.out.println("共有" + booklist.getLength() + "本书");
14
            System.out.println("-------------------------------------");
15

16
            //(2)遍历每个book节点
17
            for (int i = 0; i < booklist.getLength(); i++) {
18
                //(3)通过item(i)获取book节点,nodelist索引从0开始
19
                Node book = booklist.item(i);
20
                //(4)获取book节点的所有属性集合
21
                NamedNodeMap attrs = book.getAttributes();
22

23
                //获取属性的数量
24
                System.out.println("第" + (i + 1) + "本书有" + attrs.getLength() + "个属性");
25
                System.out.print("分别是:");
26

27
                //(5)遍历book的属性
28
                for (int j = 0; j < attrs.getLength(); j++) {
29
                    //(6)获取属性
30
                    Node att = attrs.item(j);
31
                    //(6)获取属性的名称
32
                    String attName = att.getNodeName();
33
                    System.out.print(attName + ", ");
34
                }
35
                System.out.println();
36
                System.out.println("-------------------------------------");
37
            }
38

39
        } catch (ParserConfigurationException e) {
40
            e.printStackTrace();
41
        } catch (SAXException e) {
42
            e.printStackTrace();
43
        } catch (IOException e) {
44
            e.printStackTrace();
45
        }
46
    }
47
}
打印结果:
共有2本书
-------------------------------------
第1本书有2个属性
分别是:id, type,
-------------------------------------
第2本书有1个属性
分别是:id,
-------------------------------------
8
 
1
共有2本书 
2
-------------------------------------
3
第1本书有2个属性
4
分别是:id, type, 
5
-------------------------------------
6
第2本书有1个属性
7
分别是:id, 
8
-------------------------------------

解析xml文件属性的子节点

解析子节点:
  • (1)使用getChildNodes()获取子节点集合
  • (2)遍历子节点
  • (3)获取子节点
  • (4)输出子节点名称和内容
public class DomTest {
public static void main(String[] args) {
//创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parse方法加载book.xml
Document document = db.parse("books.xml"); //获取所有book节点的集合
NodeList booklist = document.getElementsByTagName("book");
System.out.println("共有" + booklist.getLength() + "本书");
System.out.println("-------------------------------------"); //遍历每个book节点
for (int i = 0; i < booklist.getLength(); i++) {
//通过item(i)获取book节点,nodelist索引从0开始
Node book = booklist.item(i);
//获取book节点的所有属性集合
NamedNodeMap attrs = book.getAttributes(); //获取属性的数量
System.out.println("第" + (i + 1) + "本书有" + attrs.getLength() + "个属性");
System.out.print("分别是:"); //遍历book的属性
for (int j = 0; j < attrs.getLength(); j++) {
//获取属性
Node att = attrs.item(j);
//获取属性的名称
String attName = att.getNodeName();
System.out.print(attName + ", ");
}
System.out.println(); System.out.println("子节点:");
//(1)解析book节点的子节点
NodeList bookChildNodes = book.getChildNodes();
//(2)遍历bookChildNodes获取每个子节点
for (int k = 0; k < bookChildNodes.getLength(); k++) {
//(3)获取子节点
Node bookChild = bookChildNodes.item(k); //注(a)
//区分text类型的node以及element类型的node(子节点含我们不需要的文本型,所以我们要筛选)
if (bookChild.getNodeType() == Node.ELEMENT_NODE) {
//注(b)
//(4)获取和输出节点名和节点内容
//方法1:
System.out.println(bookChild.getNodeName() + ", " + bookChild.getTextContent());
//方法2:
//System.out.println(bookChild.getNodeName() + ", " + bookChild.getFirstChild().getNodeValue());
} }
System.out.println("-------------------------------------");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
x
 
1
public class DomTest { 
2
    public static void main(String[] args) {
3
        //创建DocumentBuilderFactory对象
4
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
5
        try {
6
            //创建DocumentBuilder对象
7
            DocumentBuilder db = dbf.newDocumentBuilder();
8
            //通过DocumentBuilder对象的parse方法加载book.xml
9
            Document document = db.parse("books.xml");
10

11
            //获取所有book节点的集合
12
            NodeList booklist = document.getElementsByTagName("book");
13
            System.out.println("共有" + booklist.getLength() + "本书");
14
            System.out.println("-------------------------------------");
15

16
            //遍历每个book节点
17
            for (int i = 0; i < booklist.getLength(); i++) {
18
                //通过item(i)获取book节点,nodelist索引从0开始
19
                Node book = booklist.item(i);
20
                //获取book节点的所有属性集合
21
                NamedNodeMap attrs = book.getAttributes();
22

23
                //获取属性的数量
24
                System.out.println("第" + (i + 1) + "本书有" + attrs.getLength() + "个属性");
25
                System.out.print("分别是:");
26

27
                //遍历book的属性
28
                for (int j = 0; j < attrs.getLength(); j++) {
29
                    //获取属性
30
                    Node att = attrs.item(j);
31
                    //获取属性的名称
32
                    String attName = att.getNodeName();
33
                    System.out.print(attName + ", ");
34
                }
35
                System.out.println();
36

37
                System.out.println("子节点:");
38
                //(1)解析book节点的子节点
39
                NodeList bookChildNodes = book.getChildNodes();
40
                //(2)遍历bookChildNodes获取每个子节点
41
                for (int k = 0; k < bookChildNodes.getLength(); k++) {
42
                    //(3)获取子节点
43
                    Node bookChild = bookChildNodes.item(k);
44

45
                    //注(a)
46
                    //区分text类型的node以及element类型的node(子节点含我们不需要的文本型,所以我们要筛选)
47
                    if (bookChild.getNodeType() == Node.ELEMENT_NODE) {
48
                        //注(b)
49
                        //(4)获取和输出节点名和节点内容
50
                        //方法1:
51
                        System.out.println(bookChild.getNodeName() + ",  " + bookChild.getTextContent());
52
                        //方法2:
53
                        //System.out.println(bookChild.getNodeName() + ",  " + bookChild.getFirstChild().getNodeValue());
54
                    }
55

56
                }
57
                System.out.println("-------------------------------------");
58
            }
59
        } catch (ParserConfigurationException e) {
60
            e.printStackTrace();
61
        } catch (SAXException e) {
62
            e.printStackTrace();
63
        } catch (IOException e) {
64
            e.printStackTrace();
65
        }
66
    }
67
}
打印结果:
共有2本书
-------------------------------------
第1本书有2个属性
分别是:id, type,
子节点:
name, test冰与火之歌
author, 乔治马丁
year, 2014
price, 89
-------------------------------------
第2本书有1个属性
分别是:id,
子节点:
name, 安徒生童话
year, 2004
price, 77
language, English
-------------------------------------
18
 
1
共有2本书 
2
-------------------------------------
3
第1本书有2个属性
4
分别是:id, type, 
5
子节点:
6
name,  test冰与火之歌
7
author,  乔治马丁
8
year,  2014
9
price,  89
10
-------------------------------------
11
第2本书有1个属性
12
分别是:id, 
13
子节点:
14
name,  安徒生童话
15
year,  2004
16
price,  77
17
language,  English
18
-------------------------------------


 
注(a):解析时是把空白也算为文本型的子节点,如下看似只有4个子节点,算上空白会输出9个子节点。
<bookstroe>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
</bookstroe
8
 
1
<bookstroe> 
2
  <book id="1">  
3
      <name>冰与火之歌</name>  
4
      <author>乔治马丁</author>  
5
      <year>2014</year>  
6
      <price>89</price>  
7
  </book>
8
</bookstroe
如上图所示,黄色和橙色也都算成了text类型的节点,这是我们不需要的,往往需要判断筛选。

<bookstroe>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
</bookstroe>
 
1
<bookstroe> 
2
  <book id="1">  
3
      <name>冰与火之歌</name>  
4
      <author>乔治马丁</author>  
5
      <year>2014</year>  
6
      <price>89</price>  
7
  </book>
8
</bookstroe>
注(b):假如此时我们想要获取<name>中的“冰与火之歌”
1)获取子节点的内容的时候,不是使用getNodeValue(),如上图,该方法只会返回null;我们要使用getTextContent()来获取两个标签中间的内容;
2)另外,也可以使用获取这个子节点的子节点,之前有提到,text也被视为子节点,这里的“冰与火之歌”被视为<name>的子节点,所以获取子节点的子节点以后,再使用getNodeValue()才有意义,即先获取book的子节点<name>,再获取name的子节点;
3)这两种方法的区别:
假如有<name><a>test</a>冰与火之歌</name>
getTextContext() --> test冰与火之歌(获取name下所有的文本并拼接起来)
getFirstChild().getNodeValue() --> null(获得子节点并输出其值)


如何在Java中保留xml数据的结构?

创建一个Book类,包含属性name、author、year、price等,在解析该xml的同时,就对该对象中的属性进行赋值。
当然,多个对象的时候,自然还需要存到集合中去。

附件列表

Java是如何解析xml文件的(DOM)的更多相关文章

  1. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  2. Java 创建过滤器 解析xml文件

    今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...

  3. 用JDK自带的包来解析XML文件(DOM+xpath)

    DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom.org.xml.sax 和javax.xml.parsers包就可以满意条件了.(1)org.w3c.do ...

  4. java使用dom4j解析xml文件

    关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析.假如有如下xml: dom4j解析xml其实很简单,只要你有点java基础,知道xml文件.结合下面的xml文件和java代码, ...

  5. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

  6. java使用document解析xml文件

    准备工作: 1创建java工程 2创建xml文档. 完成后看下面代码: import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; ...

  7. java 使用SAX解析xml 文件

    http://www.cnblogs.com/allenzheng/archive/2012/12/01/2797196.html 为了学习方便,忘博主勿究

  8. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  9. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

随机推荐

  1. IPv4地址分类及子网划分

    IPv4地址分为A,B,C,D,E类: A类:1.0.0.0~126.255.255.255,默认子网掩码/8,即255.0.0.0 (其中127.0.0.0~127.255.255.255为环回地址 ...

  2. iOS 开源一个高度可定制支持各种动画效果,支持单击双击,小红点,支持自定义不规则按钮的tabbar

    TYTabbarAnimationDemo 业务需求导致需要做一个tabbar,里面的按钮点击带有动画效果,tabbar中间的按钮凸出,凸出部分可以点击,支持badge 小红点等,为此封装了一个高度可 ...

  3. Win7常用快捷键整理

    Win7常用快捷键整理.. -------------------- Win + Pause:显示系统属性对话框 ------------------------------------ Win7系统 ...

  4. 【Linux】修改Linux字符集

    一.查看字符集 常见的几种方法: (1) [root@devhxyw03 ~]# echo $LANG zh_CN.GBK (2) [root@devhxyw03 ~]# env | grep LAN ...

  5. 灾难恢复-boot分区的恢复方法

    boot分区是系统启动中最重要的部分,如果服务器由于病毒攻击又或者被管理员误删除了boot分区.那么就会存在潜在的风险.为什么说是潜在的风险?因为boot分区被删除后系统仍在继续运行,看似无状况但是在 ...

  6. JDK+Tomcat搭建JSP运行环境--JSP基础

    一.搭建JSP运行环境之前需要了解的基本知识 配置JSP运行环境之前,我们需要了解JSP的运行机制.只有了解JSP运行机制后,我们才能知道为什么要搭建JSP运行环境?如何去搭建JSP运行环境?为什么要 ...

  7. 【BUG】插入或者更新超过限制后写入数据库失败

      Error Code: 1064 - You have an error in your SQL syntax; check the manual that corresponds to your ...

  8. MVC客户端验证

    引用JS 注意:删除Layout里面默认引用的JQUERY,否则可能引起JS冲突. <link href="~/Content/Site.css" rel="sty ...

  9. Day3 - Linux系统安装_Centos6.9

    第1章 虚拟机安装  1.1 镜像下载 1.1.1 新版本下载 http://mirrors.aliyun.com  #阿里云官方镜像站点 1.1.2 旧版本下载 http://vault.cento ...

  10. spring mvc:日志对象logger的复用

    在采用Spring mvc+org.slf4j.Logger开发项目时,发现几乎每个controller或者manager都有的一个标配: private final static Logger LO ...