XML解析

XML的数据解析

1.DOM方式

Document Object Model,文档对象模型。这种方式是w3c推荐的处理XML的一中方式。把XML文档当做一个树对待;对于增删改查非常方便。

缺点:构建此树,必须加载整个XML文档。导致内存溢出(XML文件很大)。

导入的包:org.w3c.*

2.SAX方式(推)

Simple API for XML。这种方式不是官方标准。属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

优点:读取到文档的某一部分时就进行解析。占用内存小。

缺点:只能读。

导入的包:org.sax.*

3.PULL方式(拉)

这种方式不是官方标准。http://www.xmlpull.org

优点:读取到文档的某一部分时就进行解析。占用内存小。

缺点:只能读。

导入的包:org.xmlpull.*

 

Dom解析方式是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,下面结合这个xml文件来进行dom解析。

 Xml代码

<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book id="12">
  <name>thinking in java</name>
  <price>85.5</price>
 </book>
 <book id="15">
  <name>Spring in Action</name>
  <price>39.0</price>
 </book>
</books>

然后结合一张图来发现dom解析时需要注意的地方

XML解析 - quanquan127@126 - 学无止境

在这里当我们得到节点book时,也就是图中1所画的地方,如果我们调用它的getChildNodes()方法,大家猜猜它的子节点有几个?不包括它的孙子节点,thinking in java这种的除外,因为它是孙子节点。它总共有5个子节点,分别是图中2、3、4、5、6所示的那样。所以在解析时,一定要小心,不要忽略空白的地方。

然后看代码来解析book.xml文件

DomParseService.java

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

import com.xtlh.cn.entity.Book;

public class DomParseService {
 public List<Book> getBooks(InputStream inputStream) throws Exception{
  List<Book> list = new ArrayList<Book>();
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = factory.newDocumentBuilder();
  Document document = builder.parse(inputStream);
  Element element = document.getDocumentElement();
  
  NodeList bookNodes = element.getElementsByTagName("book");
  for(int i=0;i<bookNodes.getLength();i++){
   Element bookElement = (Element) bookNodes.item(i);
   Book book = new Book();
   book.setId(Integer.parseInt(bookElement.getAttribute("id")));
   NodeList childNodes = bookElement.getChildNodes();
//   System.out.println("*****"+childNodes.getLength());
   for(int j=0;j<childNodes.getLength();j++){
    if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
     if("name".equals(childNodes.item(j).getNodeName())){
      book.setName(childNodes.item(j).getFirstChild().getNodeValue());
     }else if("price".equals(childNodes.item(j).getNodeName())){
      book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));
     }
    }
   }//end for j
   list.add(book);
  }//end for i
  return list;
 }

 
Book.java用来组装数据和盛放数据

 public class Book {
 private int id;
 private String name;
 private float price;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public float getPrice() {
  return price;
 }
 public void setPrice(float price) {
  this.price = price;
 }
 @Override
 public String toString(){
  return this.id+":"+this.name+":"+this.price;
 }
}

测试使用单元测试如下ParseTest.java

public class ParseTest extends TestCase
{
 public void testDom() throws Exception
 {
   InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");
   DomParseService dom = new DomParseService();
  List<Book> books = dom.getBooks(input);
   for(Book book : books)
  {
    System.out.println(book.toString());
   }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值