您现在的位置:首页 >> 前端 >> 内容

如何解析本地和线上XML文件获取相应的内容

时间:2017/11/17 11:03:09 点击:

  核心提示:一、使用Dom解析本地XML1、本地XML文件为:test.xmlthink in java张三家75.00java核心基础王二家65.00Oracle李四家75.002、建立book类储存解析出来的...

一、使用Dom解析本地XML
1、本地XML文件为:test.xml



  
    think in java
    张三
    
    75.00
  
  
    java核心基础
    王二
    
    65.00
  
  
    Oracle
    李四
    
    75.00
  

2、建立book类储存解析出来的内容

package com.yc.domain;

public class Book {
    private  int id;
    private String bookName;
    private String bookAuthor;
    private String bookISBN;
    private String bookPrice;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public String getBookAuthor() {
        return bookAuthor;
    }
    public void setBookAuthor(String bookAuthor) {
        this.bookAuthor = bookAuthor;
    }
    public String getBookISBN() {
        return bookISBN;
    }
    public void setBookISBN(String bookISBN) {
        this.bookISBN = bookISBN;
    }
    public String getBookPrice() {
        return bookPrice;
    }
    public void setBookPrice(String bookPrice) {
        this.bookPrice = bookPrice;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", bookName=" + bookName + ", bookAuthor="
                + bookAuthor + ", bookISBN=" + bookISBN + ", bookPrice="
                + bookPrice + "]";
    }


}

3、使用Dom解析:文件名为TestDom.java

package com.yc.utils;

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.yc.domain.Book;

public class TestDom {
    public List getBook(File file){
        List bookList=new ArrayList();
        try {
            //创建一个文档构建工厂
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            //通过工厂生产DocumentBuilder对象
            DocumentBuilder builder=factory.newDocumentBuilder();
            //将指定file的内容解析  返回一个Document的对象
            Document doc=builder.parse(file);
            Element element=doc.getDocumentElement();//获取根元素
            //System.out.println(element);
            NodeList nodeList=doc.getElementsByTagName("Book");
            //System.out.println(nodeList.getLength());
            int len=nodeList.getLength();
            for (int i = 0; i < len; i++) {
                Book  book=new Book();
                Node node=nodeList.item(i);
                book.setId(Integer.parseInt(node.getAttributes().getNamedItem("id").getNodeValue()));
                int len2=nodeList.item(i).getChildNodes().getLength();
                for (int j = 0; j < len2; j++) {
                    Node node1=nodeList.item(i).getChildNodes().item(j);
                    if(node1.getNodeType()==1){
                        String content=node1.getFirstChild().getNodeValue();
                        String nodeName=node1.getNodeName();
                        switch (nodeName) {
                        case "bookName":
                             book.setBookName(content);
                            break;
                        case "bookAuthor":
                            book.setBookAuthor(content);
                            break;
                        case "bookISBN":
                            book.setBookISBN(content);
                            break;
                        case "bookPrice":
                            book.setBookPrice(content);
                            break;

                        default:
                            break;
                        }
                    }
                }
                bookList.add(book);
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bookList;
    }
    public static void main(String[] args) {
        TestDom td=new TestDom();
        File file=new File("test.xml");
        List list=td.getBook(file);
        for (int i = 0; i 

4、解析结果:

Book [id=1, bookName=think in java, bookAuthor=张三, bookISBN=家, bookPrice=75.00]
Book [id=2, bookName=java核心基础, bookAuthor=王二, bookISBN=家, bookPrice=65.00]
Book [id=3, bookName=Oracle, bookAuthor=李四, bookISBN=家, bookPrice=75.00]

二、使用Dom4j解析本地XML文件
其他同上只是换用不同的解析方法:
本次使用Dom4j解析本地文件test.xml

package com.yc.utils;

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.yc.domain.Book;

public class TestDom4j {
    public static void main(String[] args) {
        TestDom4j td=new TestDom4j();
        File file=new File("test.xml");
        List list=td.findAll(file);
        for (int i = 0; i  findAll(File file){
        List  bookList=new ArrayList();
        SAXReader  reader=new SAXReader();
        Document doc=null;
        try {
            doc=reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Element  root=doc.getRootElement();//取出根节点
        //System.out.println(root);
        //迭代出所有子节点
        Iterator  its=root.elementIterator();
        Book  book=null;
        while(its.hasNext()){
            Element et=(Element) its.next();//取出所有book节点
            if("Book".equals(et.getName())){
                book=new Book();
                //迭代属性
                for(Iterator  attrIts=et.attributeIterator();attrIts.hasNext();){
                    Attribute attr=(Attribute) attrIts.next();
                    if("id".equals(attr.getName())){
                        book.setId(Integer.parseInt(attr.getValue()));
                    }
                }
                //迭代Book地下元素
                for(Iterator it=et.elementIterator();it.hasNext();){
                    Element el=(Element) it.next();
                    switch (el.getName()) {
                    case "bookName":
                        book.setBookName(el.getText());
                        break;
                    case "bookAuthor":
                        book.setBookAuthor(el.getText());
                        break;
                    case "bookISBN":
                        book.setBookISBN(el.getText());
                        break;
                    case "bookPrice":
                        book.setBookPrice(el.getText());
                        break;
                    default:
                        break;
                    }

                }
            }
            bookList.add(book);
        }
        return bookList;
    }
}

解析结果同上
三、使用Sax解析本地文件
其它同上只是换种解析方法
1.配置Sax文件显示解析过程

package com.yc.utils;

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.yc.domain.Book;

public class SaxXML extends DefaultHandler {
    private List bookList;
    private Book book;
    private String tagName;//存放每一次存放的标签
    //当我解析器解析  触发方法
    @Override
    public void startDocument() throws SAXException {
        bookList=new ArrayList();
        System.out.println("开始读文档了");
    }
    //当解析到元素节点时  触发这个方法
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("开始读元素了");
        if("Book".equals(qName)){
            book=new Book();
            book.setId(Integer.parseInt(attributes.getValue("id")));
        }
        tagName=qName;
    }
    //当每次解析文本节点就调用这个
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println("文本解析中");
        if(book!=null){
            String content=new String(ch,start,length);
            if("bookName".equals(tagName)){
                book.setBookName(content);
            }else if("bookAuthor".equals(tagName)){
                book.setBookAuthor(content);
            }else if("bookISBN".equals(tagName)){
                book.setBookISBN(content);
            }else if("bookPrice".equals(tagName)){
                book.setBookPrice(content);
            }
        }
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("文档结束了");
    }
    //元素结束
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("元素结束了");
        if("Book".equals(qName)){
            bookList.add(book);
            book=null;
            }
        tagName="";

    }
    public List getBookList() {
        return bookList;
    }

}

2、使用Sax解析本地文件test.xml

package com.yc.utils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
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 com.yc.domain.Book;

public class TestSax {
    public List findAll(File file){
        List bookList=new ArrayList();
        //获取SAX解析工厂
        SAXParserFactory spf= SAXParserFactory.newInstance();
        try {
            SAXParser parser=spf.newSAXParser();
            SaxXML sx=new SaxXML();
            parser.parse(file, sx);
            bookList=sx.getBookList();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bookList;
    }
    public static void main(String[] args) {
        TestSax ts=new TestSax();
        File file=new File("test.xml");
        List list=ts.findAll(file);
        for (Book book:list) {
            System.out.println(book.toString());
        }
    }

}

3.解析结果:

开始读文档了
开始读元素了
文本解析中
开始读元素了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
开始读元素了
文本解析中
元素结束了
文本解析中
元素结束了
文本解析中
元素结束了
文档结束了
Book [id=1, bookName=think in java, bookAuthor=张三, bookISBN=家, bookPrice=75.00]
Book [id=2, bookName=java核心基础, bookAuthor=王二, bookISBN=家, bookPrice=65.00]
Book [id=3, bookName=Oracle, bookAuthor=李四, bookISBN=家, bookPrice=75.00]

四、解析线上XMl文件我們这里以解析线上新闻为例
注解:1.线上地址为:https://api.avatardata.cn/GuoNeiNews/Query?key=b5884e12578141e888cf17fe62903bd2&page=1&rows=10&dtype=xml
2.xml文件为nwes.xml



  0
  Succes
  
    
      2016-08-28 00:21
      网易国内
      https://s.cimg.163.com/cnews/2016/8/28/2016082800201872c58_550.jpg.119x83.jpg
      https://news.163.com/16/0828/00/BVH193060001121M.html#f=dlist
    
    
      2016-08-27 19:41
      网易国内
      https://s.cimg.163.com/catchpic/8/8B/8B6D4CBC561C0DC041A842C539584115.jpg.119x83.jpg
      https://news.163.com/16/0827/19/BVGH7F1S0001124J.html#f=dlist
    
    
      2016-08-27 17:30
      网易国内
      https://s.cimg.163.com/photo/0001/2016-08-26/t_BVCOE4IO6VVV0001.jpg.119x83.jpg
      https://news.163.com/16/0827/17/BVG9OSRD00014SEH.html#f=dlist
    
    
      2016-08-27 17:43
      网易国内
      https://s.cimg.163.com/catchpic/1/1E/1E766CCB83F19FCD738C223989B52C14.jpg.119x83.jpg
      https://news.163.com/16/0827/17/BVGAG3OF00014SEH.html#f=dlist
    
    
      2016-08-27 18:48
      网易国内
      https://s.cimg.163.com/catchpic/9/91/916E9B868A41E063AB768112E4016DE1.jpg.119x83.jpg
      https://news.163.com/16/0827/18/BVGE6V82000146BE.html#f=dlist
    
    
      2016-08-27 14:38
      网易国内
      https://s.cimg.163.com/catchpic/7/76/7673DDB4A375F3CE365A27E05D3551C8.jpg.119x83.jpg
      https://news.163.com/16/0827/14/BVFVTQSD00014SEH.html#f=dlist
    
    
      2016-08-27 14:46
      网易国内
      https://s.cimg.163.com/cnews/2016/8/27/20160827144553a4f90.jpg.119x83.jpg
      https://news.163.com/16/0827/14/BVG0BKN70001124J.html#f=dlist
    
    
      2016-08-27 15:28
      网易国内
      https://s.cimg.163.com/cnews/2016/8/27/20160827112149ecd50.gif.119x83.jpg
      https://news.163.com/16/0827/15/BVG2OPMO00014JB6.html#f=dlist
    
    
      2016-08-27 15:37
      网易国内
      https://s.cimg.163.com/photo/0001/2016-08-26/t_BVCOE4IO6VVV0001.jpg.119x83.jpg
      https://news.163.com/16/0827/15/BVG39ELT0001124J.html#f=dlist
    
    
      2016-08-27 15:56
      网易国内
      https://s.cimg.163.com/catchpic/1/1E/1E766CCB83F19FCD738C223989B52C14.jpg.119x83.jpg
      https://news.163.com/16/0827/15/BVG4C7SD0001124J.html#f=dlist
    
  

3.建立News类储存解析内容

package com.yc.domain;

public class News {
    private String ctime;
    private String title;
    private String description;
    private String picUrl;
    private String url;
    public String getCtime() {
        return ctime;
    }
    public void setCtime(String ctime) {
        this.ctime = ctime;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getPicUrl() {
        return picUrl;
    }
    public void setPicUrl(String picUrl) {
        this.picUrl = picUrl;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    @Override
    public String toString() {
        return "News [ctime=" + ctime + ", title=" + title + ", description="
                + description + ", picUrl=" + picUrl + ", url=" + url + "]";
    }



}

4.解析线上新闻XML文件

package com.yc.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
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.yc.domain.Book;
import com.yc.domain.News;

public class TestNews {

    public static void main(String[] args) {
        List newsList=new ArrayList();

            try {
                File file=new File("news.xml");
                if(!file.exists()){
                    URL url=new URL("https://api.avatardata.cn/GuoNeiNews/Query?key=b5884e12578141e888cf17fe62903bd2&page=1&rows=10&dtype=xml");
                    URLConnection con=url.openConnection();
                    con.connect();
                    InputStream is=con.getInputStream();
                    OutputStream os=new FileOutputStream(file,true);
                    byte[] bt=new byte[1024];
                    int len=-1;
                    while((len=is.read(bt))!=-1){
                        os.write(bt,0,len);
                    }
                    os.flush();
                    os.close();
                    is.close();
                }
                /*URL url=new URL("https://api.avatardata.cn/GuoNeiNews/Query?key=b5884e12578141e888cf17fe62903bd2&page=1&rows=10&dtype=xml");
                URLConnection con=url.openConnection();
                con.connect();
                InputStream is=con.getInputStream();*/
                DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
                DocumentBuilder builder=factory.newDocumentBuilder();
                Document doc=builder.parse(file);
                Element  element=doc.getDocumentElement();
                //System.out.println(element);
                NodeList  n1=doc.getElementsByTagName("NewsObj");
                //System.out.println(n1.getLength());
                int len=n1.getLength();
                for (int i = 0; i < len; i++) {
                    News news=new News();
                    Node node=n1.item(i);
                    int len2=n1.item(i).getChildNodes().getLength();
                    for (int j = 0; j < len2; j++) {
                        Node node1=n1.item(i).getChildNodes().item(j);
                        if(node1.getNodeType()==1){
                            String content=node1.getFirstChild().getNodeValue();
                            String nodeName=node1.getNodeName();
                            switch (nodeName) {
                            case "ctime":
                                news.setCtime(content);
                                break;
                            case "title":
                                news.setTitle(content);
                                break;
                            case "description":
                                news.setDescription(content);
                                break;
                            case "picUrl":
                                news.setPicUrl(content);
                                break;
                            case "url":
                                news.setUrl(content);
                                break;

                            default:
                                break;
                            }
                        }
                    }
                    newsList.add(news);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }
            for (int i = 0; i 

作者:网络 来源:Mars的博客