解析XML数据

在 Java 程序中读取 XML 文件的过程称为解析 XML

解析 XML 文件的方式

1) DOM 解析 (java 官方提供)

2) SAX 解析(java 官方提供)

3) JDOM 解析(第三方提供)

4) DOM4J 解析(第三方提供)

DOM 解析 XML 的步骤

1) 创建一个 DocumentBuilderFactory 的对象       Document文档  Factory工厂

2) 创建一个 DocumentBuilder 对象

3) 通过DocumentBuilder的parse(...)方法得到Document对象

4) 通过 getElementsByTagName(...)方法获取到节点的列表

5) 通过 for 循环遍历每一个节点

6) 得到每个节点的属性和属性值

7) 得到每个节点的节点名和节点值

 1 import java.io.IOException;
 2 
 3 import javax.xml.parsers.DocumentBuilder;
 4 import javax.xml.parsers.DocumentBuilderFactory;
 5 import javax.xml.parsers.ParserConfigurationException;
 6 
 7 import org.w3c.dom.Document;
 8 import org.w3c.dom.NamedNodeMap;
 9 import org.w3c.dom.Node;
10 import org.w3c.dom.NodeList;
11 import org.xml.sax.SAXException;
12 
13 public class TestDOMParse {
14     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
15     //    1)    创建一个DocumentBuilderFactory的对象
16         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
17     //    2)    创建一个DocumentBuilder对象
18         DocumentBuilder db=dbf.newDocumentBuilder();
19     //    3)    通过DocumentBuilder的parse(...)方法得到Document对象
20         Document doc=db.parse("book.xml");
21     //    4)    通过getElementsByTagName(...)方法获取到节点的列表
22         NodeList bookList=doc.getElementsByTagName("book");//有2个book节点
23         //System.out.println(bookList.getLength());
24     //    5)    通过for循环遍历每一个节点  
25         for(int i=0;i<bookList.getLength();i++){
26             //6)    得到每个节点的属性和属性值
27             Node book=bookList.item(i);
28             NamedNodeMap attrs=book.getAttributes(); //得到了属性的集合
29             //循环遍历每一个属性
30             for(int j=0;j<attrs.getLength();j++){
31                 //得到每一个属性
32                 Node id=attrs.item(j);
33                 System.out.println("属性的名称:"+id.getNodeName()+"	"+id.getNodeValue());
34             }
35         }
36     System.out.println("
每个节点的名和节点的值");
37 //        7)    得到每个节点的节点名和节点值
38     for(int i=0;i<bookList.getLength();i++){
39         //得到每一个book节点
40         Node book=bookList.item(i);
41         NodeList subNode=book.getChildNodes();
42         System.out.println("子节点的个数:"+subNode.getLength());
43         //使用for循环遍历每一book的子节点
44         for(int j=0;j<subNode.getLength();j++){
45             Node childNode=subNode.item(j);
46             //System.out.println(childNode.getNodeName());
47             short type=childNode.getNodeType(); //获取节点的类型
48             if(type==Node.ELEMENT_NODE){
49                 System.out.println("节点的名称:"+childNode.getNodeName()+"	"+childNode.getTextContent());
50             }
51             
52         }
53     }
54 
55     }
56 }
View Code

 解析XML数据

解析XML数据

 ------------------------------------------------------------------------------------------------------------------------------------------------------

SAX 方式解析 XML 数据

SAX 的概述

SAX,全称 Simple API for XML,是一种以事件驱动的XMl API,SAX 与 DOM 不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,

所以它解析 XML 具有速度快,占用内存少的优点

SAX 解析 XML 的步骤

1) 创建 SAXParserFactory 的对象
2) 创建 SAXParser 对象 (解析器)
3) 创建一个 DefaultHandler 的子类
4) 调用 parse 方法

 1 import java.io.IOException;
 2 
 3 import javax.xml.parsers.ParserConfigurationException;
 4 import javax.xml.parsers.SAXParser;
 5 import javax.xml.parsers.SAXParserFactory;
 6 
 7 import org.xml.sax.SAXException;
 8 
 9 public class TestSAXParse {
10     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
11     //1)    创建SAXParserFactory的对象
12         SAXParserFactory spf=SAXParserFactory.newInstance();
13     //2)    创建SAXParser对象 (解析器)
14         SAXParser parser=spf.newSAXParser();
15     //3)    创建一个DefaultHandler的子类
16         BookDeaultHandler bdh=new BookDeaultHandler();
17     //4)    调用parse方法
18         parser.parse("book.xml", bdh);
19     }
20 }
View Code

DefaultHandler的子类

 1 import org.xml.sax.Attributes;
 2 import org.xml.sax.SAXException;
 3 import org.xml.sax.helpers.DefaultHandler;
 4 
 5 public class BookDeaultHandler extends DefaultHandler {
 6     //重写第一个方法
 7     /**解析xml文档开始时调用*/
 8     @Override
 9     public void startDocument() throws SAXException {
10         // TODO Auto-generated method stub
11         super.startDocument();
12         System.out.println("解析xml文档开始");
13     }
14     /*解析xml文档结束时调用*/
15     @Override
16     public void endDocument() throws SAXException {
17         // TODO Auto-generated method stub
18         super.endDocument();
19         System.out.println("解析xml文档结束");
20     }
21     /**解析xml文档中的节点时调用*/
22     @Override
23     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
24         // TODO Auto-generated method stub
25         super.startElement(uri, localName, qName, attributes);
26         //System.out.println("解析xml文档中的节点时调用");
27         /**判断,如果是book节点,获取节点的属性和属性值*/
28         if("book".equals(qName)){
29             //获取所有的属性
30             int count=attributes.getLength();//属性的个数
31             //循环获取每个属性
32             for(int i=0;i<count;i++){
33                 String attName=attributes.getQName(i);//属性名称
34                 String attValue=attributes.getValue(i);//属性值
35                 System.out.println("属性名称:"+attName+"	属性值为:"+attValue);
36             }
37         }else if(!"books".equals(qName)&&!"book".equals(qName)){
38             System.out.print("节点的名称:"+qName+"	");
39         }
40         
41     }
42     /**解析xml文档中的节点结束调用*/
43     @Override
44     public void endElement(String uri, String localName, String qName) throws SAXException {
45         // TODO Auto-generated method stub
46         super.endElement(uri, localName, qName);
47         //System.out.println("解析xml文档中的节点结束调用");
48     }
49     @Override
50     public void characters(char[] ch, int start, int length) throws SAXException {
51         // TODO Auto-generated method stub
52         super.characters(ch, start, length);
53         String value=new String(ch,start,length);
54         if(!"".equals(value.trim())){
55             System.out.println(value);
56         }
57         
58     }
59 }
View Code

解析XML数据

---------------------------------------------------------------------------------------------------------------------------------------

JDOM 解析 XML 数据

JDOM 概述

JDOM 是一种解析 XML 的 Java 工具包,它基于树型结构,利用纯Java的技术对XML文档实现解析。所以中适合于Java语言

导入jar包

选中复制

解析XML数据

粘贴到lib,之后选中Jdom右键构建路径,添加至构建路径

解析XML数据

JDOM 解析 XML 的步骤

1) 创建一个 SAXBuilder 对象

2) 调用 build 方法,得到 Document 对象(通过 IO 流)

3) 获取根节点

4) 获取根节点的直接子节点的集合

5) 遍历集合

 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.IOException;
 4 import java.util.List;
 5 
 6 import org.jdom.Attribute;
 7 import org.jdom.Document;
 8 import org.jdom.Element;
 9 import org.jdom.JDOMException;
10 import org.jdom.input.SAXBuilder;
11 
12 public class TestJDOM {
13     public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException {
14 //        1)    创建一个SAXBuilder对象
15         SAXBuilder sb=new SAXBuilder();
16 //    2)    调用build方法,得到Document对象(通过IO流)
17         Document doc=sb.build(new FileInputStream("book.xml"));
18 //    3)    获取根节点
19         Element root=doc.getRootElement(); //books元素
20 //    4)    获取根节点的直接子节点的集合
21         List<Element> bookEle=root.getChildren();//book,2个book
22 //    5)    遍历集合,得到book的每一个子节点(子元素)
23         for(int i=0;i<bookEle.size();i++){
24             Element book=bookEle.get(i);
25             //得到属性集合
26             List<Attribute> attList=book.getAttributes();
27             //遍历属性的集合得到每一个属性
28             for (Attribute attr : attList) {
29                 System.out.println(attr.getName()+"	"+attr.getValue());
30             }
31         }
32         
33         //得到每一个子节点
34         System.out.println("
-----------------------");
35         for(int i=0;i<bookEle.size();i++){
36             Element book=bookEle.get(i);//得到每一个book节点
37             List<Element> subBook=book.getChildren();
38             //遍历每一个节点,获取节点名称节点值
39             for (Element ele : subBook) {
40                 System.out.println(ele.getName()+"	"+ele.getValue());
41             }
42             System.out.println("=========================================");
43         }
44 
45     }
46 }
View Code

解析XML数据

------------------------------------------------------------------------------------------------------------------------------------------------------------

DOM4J 方式解析 XML 数据

DOM4J 是一个 Java 的 XML API,是 JDOM 的升级品,用来读写 XML 文件的

DOM4J 解析 XML 的步骤

1) 创建 SAXReader 对象

2) 调用 read 方法

3) 获取根元素

4) 通过迭代器遍历直接节点

 1 import java.io.File;
 2 import java.util.ArrayList;
 3 import java.util.Iterator;
 4 import java.util.List;
 5 
 6 import org.dom4j.Attribute;
 7 import org.dom4j.Document;
 8 import org.dom4j.DocumentException;
 9 import org.dom4j.Element;
10 import org.dom4j.io.SAXReader;
11 
12 import com.bjsxt.entity.Book;
13 
14 public class TestDOM4J {
15     public static void main(String[] args) throws DocumentException {
16 //        1)    创建SAXReader对象
17         SAXReader reader=new SAXReader();
18 //    2)    调用read方法
19         Document doc=reader.read(new File("book.xml"));
20 //    3)    获取根元素
21         Element root=doc.getRootElement();//books
22 //    4)    通过迭代器遍历直接节点
23         for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
24             Element bookEle=iteBook.next();
25             //System.out.println(bookEle.getName());
26             //得到book的属性
27             for(Iterator<Attribute> iteAtt=bookEle.attributeIterator();iteAtt.hasNext();){
28                 Attribute att=iteAtt.next();
29                 System.out.println(att.getName()+"	"+att.getText());
30             }
31         }
32         
33         System.out.println("
------------------------------------");
34         List<Book> bookList=new ArrayList<Book>();
35         for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
36             //创建Book对象
37             Book book=new Book();
38             Element bookEle=iteBook.next();//得到每一个book
39             //使用for循环继续遍历
40             for(Iterator<Element> subBookEle=bookEle.elementIterator();subBookEle.hasNext();){
41                 //得到每一个子元素
42                 Element subEle=subBookEle.next();
43                 System.out.println(subEle.getName()+"	"+subEle.getText());
44                 /**
45                  * 封装成Book对象
46                  * */
47                 //获取节点的名称
48                 String nodeName=subEle.getName();//name,author,price
49                 //使用switch判断
50                 switch (nodeName) {
51                 case "name":
52                     book.setName(subEle.getText());
53                     break;
54                 case "author":
55                     book.setAuthor(subEle.getText());
56                     break;
57                 case "price":
58                     book.setPrice(Double.parseDouble(subEle.getText()));
59                     break;
60             }
61             
62         }
63                 //添加到集合中
64             bookList.add(book);
65         }
66         
67         //遍历集合
68         System.out.println("
遍历集合-----------------------
");
69         for (Book b : bookList) {
70             System.out.println(b.getName()+"	"+b.getAuthor()+"	"+b.getPrice());
71         }
72     }
73 }
View Code
 1 public class Book {
 2     //私有属性
 3     private String name;
 4     private String author;
 5     private double price;
 6     public String getName() {
 7         return name;
 8     }
 9     public void setName(String name) {
10         this.name = name;
11     }
12     public String getAuthor() {
13         return author;
14     }
15     public void setAuthor(String author) {
16         this.author = author;
17     }
18     public double getPrice() {
19         return price;
20     }
21     public void setPrice(double price) {
22         this.price = price;
23     }
24     public Book(String name, String author, double price) {
25         super();
26         this.name = name;
27         this.author = author;
28         this.price = price;
29     }
30     public Book() {
31         super();
32     }
33     
34 }
View Code

四种解析 XML 的特点

1)DOM 解析:

形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。

2)SAX 解析:

采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时

3)JDOM 解析:

仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

4)DOM4J 解析:

JDOM 的一种智能分支,它合并了许多超出基本 XML 文档表示的功能。

它使用接口和抽象基本类方法。

具有性能优异、灵活性好、功能强大和极端易用的特点。

是一个开放源码的文件

相关推荐