XML文件解析

1.DOM方式解析XML
Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。

2.SAX方式解析XML
基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据

3.JDOM方式解析XML
简化与XML的交互并且比使用DOM实现更快,仅使用具体类而不使用接口因此简化了API,并且易于使用

4.DOM4j方式解析XML
JDOM的一种智能分支,功能较强大,建议熟练使用

下面给出例子:

books.xml

<?xml version=“1.0” encoding=“UTF-8”?>  
<bookstore>  
    <book id=“1”>  
        <name>冰与火之歌</name>  
        <author>乔治马丁</author>  
        <year>2014</year>  
        <price>89</price>  
    </book>  
    <book id=“2”>  
        <name>安徒生童话</name>  
        <author>安徒生</author>  
        <year>2004</year>  
        <price>77</price>  
    </book>  
    <book id=“3”>  
        <name>think think think</name>  
        <author>aaa</author>  
        <year>1997</year>  
        <price>100</price>  
    </book>  
</bookstore>  
<?xml version="1.0" encoding="UTF-8"?>  
<bookstore>  
    <book id="1">  
        <name>冰与火之歌</name>  
        <author>乔治马丁</author>  
        <year>2014</year>  
        <price>89</price>  
    </book>  
    <book id="2">  
        <name>安徒生童话</name>  
        <author>安徒生</author>  
        <year>2004</year>  
        <price>77</price>  
    </book>  
    <book id="3">  
        <name>think think think</name>  
        <author>aaa</author>  
        <year>1997</year>  
        <price>100</price>  
    </book>  
</bookstore>  

bean类:Book.java

 
public class Book {  
      
    /** 
     * @author lune 
     */  
      
    private int id;  
    private String name;  
    private String author;  
    private int year;  
    private double price;  
      
    /** 
     * @return the id 
     */  
    public int getId() {  
        return id;  
    }  
    /** 
     * @param id the id to set 
     */  
    public void setId(int id) {  
        this.id = id;  
    }  
    /** 
     * @return the name 
     */  
    public String getName() {  
        return name;  
    }  
    /** 
     * @param name the name to set 
     */  
    public void setName(String name) {  
        this.name = name;  
    }  
    /** 
     * @return the author 
     */  
    public String getAuthor() {  
        return author;  
    }  
    /** 
     * @param author the author to set 
     */  
    public void setAuthor(String author) {  
        this.author = author;  
    }  
    /** 
     * @return the year 
     */  
    public int getYear() {  
        return year;  
    }  
    /** 
     * @param year the year to set 
     */  
    public void setYear(int year) {  
        this.year = year;  
    }  
    /** 
     * @return the price 
     */  
    public double getPrice() {  
        return price;  
    }  
    /** 
     * @param price the price to set 
     */  
    public void setPrice(double price) {  
        this.price = price;  
    }  
      
    @Override  
    public String toString() {  
        return “Book [id=” + id + “, name=” + name + “, author=” + author + “, year=” + year + “, price=” + price + “]”;  
    }  
          
}  

 


1.DOM方式解析XML

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.NamedNodeMap;  
import org.w3c.dom.NodeList;  
  
import com.lune.bean.Book;  
  
/** 
 * 用DOM方式读取xml文件 
 * @author lune 
 */  
public class ReadxmlByDom {  
    private static DocumentBuilderFactory dbFactory = null;  
    private static DocumentBuilder db = null;  
    private static Document document = null;  
    private static List<Book> books = null;  
    static{  
        try {  
            dbFactory = DocumentBuilderFactory.newInstance();  
            db = dbFactory.newDocumentBuilder();  
        } catch (ParserConfigurationException e) {  
            e.printStackTrace();  
        }  
    }  
      
    public static List<Book> getBooks(String fileName) throws Exception{  
        //将给定 URI 的内容解析为一个 XML 文档,并返回Document对象  
        document = db.parse(fileName);  
        //按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList  
        NodeList bookList = document.getElementsByTagName(”book”);  
        books = new ArrayList<Book>();  
        //遍历books  
        for(int i=0;i<bookList.getLength();i++){  
            Book book = new Book();  
            //获取第i个book结点  
            org.w3c.dom.Node node = bookList.item(i);  
            //获取第i个book的所有属性  
            NamedNodeMap namedNodeMap = node.getAttributes();  
            //获取已知名为id的属性值  
            String id = namedNodeMap.getNamedItem(”id”).getTextContent();//System.out.println(id);  
            book.setId(Integer.parseInt(id));  
              
            //获取book结点的子节点,包含了Test类型的换行  
            NodeList cList = node.getChildNodes();//System.out.println(cList.getLength());9  
              
            //将一个book里面的属性加入数组  
            ArrayList<String> contents = new ArrayList<>();  
            for(int j=1;j<cList.getLength();j+=2){  
                  
                org.w3c.dom.Node cNode = cList.item(j);  
                String content = cNode.getFirstChild().getTextContent();  
                contents.add(content);  
                //System.out.println(contents);  
            }  
              
            book.setName(contents.get(0));  
            book.setAuthor(contents.get(1));  
            book.setYear(Integer.parseInt(contents.get(2)));  
            book.setPrice(Double.parseDouble(contents.get(3)));  
            books.add(book);  
        }  
          
        return books;  
          
    }  
      
    public static void main(String args[]){  
        String fileName = ”src/res/books.xml”;  
        try {  
            List<Book> list = ReadxmlByDom.getBooks(fileName);  
            for(Book book :list){  
                System.out.println(book);  
            }  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
          
}  

2.SAX方式解析XML
需要自定义DefaultHandler处理器

 
import java.util.ArrayList;  
import java.util.List;  
  
import org.xml.sax.Attributes;  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.DefaultHandler;  
  
import com.lune.bean.Book;  
  
/** 
 * 用SAX解析xml文件时需要的handler 
 * @author lune 
 */  
public class SAXParseHandler extends DefaultHandler {  
    private List<Book> list;         //存放解析到的book数组  
    private Book book;               //存放当前解析的book  
      
    private String content = null;   //存放当前节点值  
      
    /** 
     * 开始解析xml文档时调用此方法 
     */  
    @Override  
    public void startDocument() throws SAXException {  
          
        super.startDocument();  
        System.out.println(”开始解析xml文件”);  
        list = new ArrayList<Book>();  
    }  
  
  
  
    /**  
     * 文档解析完成后调用此方法 
     */  
    @Override  
    public void endDocument() throws SAXException {  
          
        super.endDocument();  
        System.out.println(”xml文件解析完毕”);  
    }  
  
  
  
    /** 
     * 开始解析节点时调用此方法 
     */  
    @Override  
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
          
        super.startElement(uri, localName, qName, attributes);  
          
        //当节点名为book时,获取book的属性id  
        if(qName.equals(“book”)){  
            book = new Book();  
            String id = attributes.getValue(”id”);//System.out.println(“id值为”+id);  
            book.setId(Integer.parseInt(id));  
        }  
          
    }  
  
  
    /** 
     *节点解析完毕时调用此方法 
     * 
     *@param qName 节点名 
     */  
    @Override  
    public void endElement(String uri, String localName, String qName) throws SAXException {  
          
        super.endElement(uri, localName, qName);  
        if(qName.equals(“name”)){  
            book.setName(content);  
            //System.out.println(“书名”+content);  
        }else if(qName.equals(“author”)){  
            book.setAuthor(content);  
        //  System.out.println(“作者”+content);  
        }else if(qName.equals(“year”)){  
            book.setYear(Integer.parseInt(content));  
        //  System.out.println(“年份”+content);  
        }else if(qName.equals(“price”)){  
            book.setPrice(Double.parseDouble(content));  
        //  System.out.println(“价格”+content);  
        }else if(qName.equals(“book”)){         //当结束当前book解析时,将该book添加到数组后置为空,方便下一次book赋值  
            list.add(book);  
            book = null;  
        }     
          
    }  
  
  
  
    /**  
     * 此方法用来获取节点的值 
     */  
    @Override  
    public void characters(char[] ch, int start, int length) throws SAXException {  
          
        super.characters(ch, start, length);  
          
        content = new String(ch, start, length);  
        //收集不为空白的节点值  
//      if(!content.trim().equals(“”)){  
//          System.out.println(“节点值为:”+content);  
//      }  
          
    }  
  
    public List<Book> getBooks(){  
        return list;  
    }  
      
}  
import java.io.IOException;  
import java.util.List;  
  
import javax.xml.parsers.ParserConfigurationException;  
import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.SAXParserFactory;  
  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.ParserFactory;  
  
import com.lune.bean.Book;  
import com.lune.handler.SAXParseHandler;  
  
/** 
 * 用SAX方式读取xml文件 
 * @author lune 
 */  
public class ReadXmlBySAX {  
  
    private static List<Book> books = null;  
      
    private  SAXParserFactory sParserFactory = null;  
    private  SAXParser parser = null;  
      
      
    public List<Book> getBooks(String fileName) throws Exception{  
        SAXParserFactory sParserFactory = SAXParserFactory.newInstance();  
        SAXParser parser = sParserFactory.newSAXParser();  
          
        SAXParseHandler handler = new SAXParseHandler();  
        parser.parse(fileName, handler);  
          
        return handler.getBooks();  
          
    }  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        try {  
            books = new ReadXmlBySAX().getBooks(“src/res/books.xml”);  
            for(Book book:books){  
                System.out.println(book);  
            }  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
  
}  
 

3.JDOM方式解析XML

import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
  
import org.jdom2.JDOMException;  
import org.jdom2.input.SAXBuilder;  
  
import com.lune.bean.Book;  
  
import org.jdom2.*;  
  
/** 
 * 用JDOM方式读取xml文件 
 * @author lune 
 */  
public class ReadXMLByJDom {  
      
    private List<Book> books = null;  
    private Book book = null;  
      
    public List<Book> getBooks(String fileName){  
        SAXBuilder saxBuilder = new SAXBuilder();  
        try {  
            Document document = saxBuilder.build(new FileInputStream(fileName));  
            //获取根节点bookstore  
            Element rootElement = document.getRootElement();  
            //获取根节点的子节点,返回子节点的数组  
            List<Element> bookList = rootElement.getChildren();  
            books = new ArrayList<Book>();  
            for(Element bookElement : bookList){  
                book = new Book();  
                //获取bookElement的属性  
                List<Attribute> bookAttributes = bookElement.getAttributes();  
                for(Attribute attribute : bookAttributes){  
                    if(attribute.getName().equals(“id”)){  
                        String id = attribute.getValue(); //System.out.println(id);  
                        book.setId(Integer.parseInt(id));  
                    }  
                }  
                //获取bookElement的子节点  
                List<Element> children = bookElement.getChildren();  
                for(Element child : children){  
                    if(child.getName().equals(“name”)){  
                        String name = child.getValue();//System.out.println(name);  
                        book.setName(name);  
                    }else if(child.getName().equals(“author”)){  
                        String author = child.getValue();  
                        book.setAuthor(author);//System.out.println(author);  
                    }else if(child.getName().equals(“year”)){  
                        String year = child.getValue();  
                        book.setYear(Integer.parseInt(year));  
                    }else if(child.getName().equals(“price”)){  
                        String price = child.getValue();  
                        book.setPrice(Double.parseDouble(price));  
                    }  
                      
                }  
                  
                books.add(book);  
                book = null;  
                  
            }  
              
        } catch (FileNotFoundException e) {  
              
            e.printStackTrace();  
        } catch (JDOMException e) {  
              
            e.printStackTrace();  
        } catch (IOException e) {  
              
            e.printStackTrace();  
        }  
          
        return books;  
          
    }  
  
      
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        String fileName = ”src/res/books.xml”;  
        List<Book> books= new ReadXMLByJDom().getBooks(fileName);  
        for(Book book : books){  
            System.out.println(book);  
        }  
    }  
  
}  


4.DOM4j方式解析XML

import java.io.File;  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Attribute;  
import org.dom4j.Document;  
import org.dom4j.DocumentException;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  
  
import com.lune.bean.Book;  
  
/** 
 * 用DOM4J方法读取xml文件 
 * @author lune 
 */  
public class ReadXMLByDom4j {  
      
    private List<Book> bookList = null;  
    private Book book = null;  
      
    public List<Book> getBooks(File file){  
          
        SAXReader reader = new SAXReader();  
        try {  
            Document document = reader.read(file);  
            Element bookstore = document.getRootElement();  
            Iterator storeit = bookstore.elementIterator();  
              
            bookList = new ArrayList<Book>();  
            while(storeit.hasNext()){  
                  
                book = new Book();  
                Element bookElement = (Element) storeit.next();  
                //遍历bookElement的属性  
                List<Attribute> attributes = bookElement.attributes();  
                for(Attribute attribute : attributes){  
                    if(attribute.getName().equals(“id”)){  
                        String id = attribute.getValue();//System.out.println(id);  
                        book.setId(Integer.parseInt(id));  
                    }  
                }  
                  
                Iterator bookit = bookElement.elementIterator();  
                while(bookit.hasNext()){  
                    Element child = (Element) bookit.next();  
                    String nodeName = child.getName();  
                    if(nodeName.equals(“name”)){  
                        //System.out.println(child.getStringValue());  
                        String name = child.getStringValue();  
                        book.setName(name);  
                    }else if(nodeName.equals(“author”)){  
                        String author = child.getStringValue();  
                        book.setAuthor(author);  
                    }else if(nodeName.equals(“year”)){  
                        String year = child.getStringValue();  
                        book.setYear(Integer.parseInt(year));  
                    }else if(nodeName.equals(“price”)){  
                        String price = child.getStringValue();  
                        book.setPrice(Double.parseDouble(price));  
                    }  
                }  
                bookList.add(book);  
                book = null;  
                  
            }  
        } catch (DocumentException e) {  
          
            e.printStackTrace();  
        }  
          
          
        return bookList;  
          
    }  
      
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        File file = new File(“src/res/books.xml”);  
        List<Book> bookList = new ReadXMLByDom4j().getBooks(file);  
        for(Book book : bookList){  
            System.out.println(book);  
        }  
    }  
  
}  
 

转载于:https://www.cnblogs.com/kuoAT/p/8384726.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值