Java 解析 XML 文件之 DOM 解析

来源:互联网 发布:微信pc客户端 mac 编辑:程序博客网 时间:2024/06/11 19:25

DOM(Document Object Model)解析

【原理】:DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标注。

【优点】:1,允许应用程序对数据和结构作出更改。

2,访问是双向的,可以在任何时候在书中上下导航,获取和操作任意部分的数据。

【缺点】:1,通常需要加载整个XML文档来够着层次结构,消耗资源大。


上面的相关DOM解析的讲解是我在网上搜索到的。下面话不多说了,直接看代码。

一,我们先查看一下要解析的xml文件的格式(book.xml)

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


二,就是用来解析这个book.xml的相关类了DomService类。

package com.dom.service;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import com.dom.domain.Book;public class DomService {public DomService() {}public List<Book> getBooks(File file){List<Book> list = new ArrayList<Book>();//创建一个document解析的工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();try {DocumentBuilder builder = factory.newDocumentBuilder();//获得稳定的元素节点Document document = builder.parse(file);Element element = document.getDocumentElement();//获得文档的元素节点NodeList bookNodes = element.getElementsByTagName("book");for(int i=0; i<bookNodes.getLength();i++){Element bookeElement = (Element)bookNodes.item(i);Book book = new Book();book.setId(Integer.parseInt(bookeElement.getAttribute("id")));NodeList childNodes = bookeElement.getChildNodes();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()));}}}list.add(book);}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return list;}public static void main(String[] args) {DomService service = new DomService();List<Book> list = service.getBooks(new File("d:/book.xml"));for(Book book: list){System.out.println(book.toString());}}}

三,我用了一个Book实体类,将解析的出来的数据放在Book对象里面。

package com.dom.domain;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;}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";}}

四,就是运行结果了。



0 0
原创粉丝点击