您的位置:首页 > 其它

stax解析XML的一个例子

2017-12-12 16:36 351 查看
1首先是XMl文档

Java代码  


<?xml version="1.0" encoding="UTF-8"?>  

<cve xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

     xmlns="http://cve.mitre.org/cve/downloads"  

     xsi:noNamespaceSchemaLocation="http://cve.mitre.org/schema/cve/cve_1.0.xsd">  

<item type="CVE" name="CVE-1999-0002" seq="1999-0002">  

<status>Entry</status>  

<desc>Buffer overflow in NFS mountd gives root access to remote attackers, mostly in Linux systems.</desc>  

<refs>  

<ref source="SGI" url="ftp://patches.sgi.com/support/free/security/advisories/19981006-01-I">19981006-01-I</ref>  

<ref source="CERT">CA-98.12.mountd</ref>  

<ref source="CIAC" url="http://www.ciac.org/ciac/bulletins/j-006.shtml">J-006</ref>  

<ref source="BID" url="http://www.securityfocus.com/bid/121">121</ref>  

<ref source="XF">linux-mountd-bo</ref>  

</refs>  

</item>  

  

</cve>  

 2具体的解析类:

Java代码  


package com.test;  

  

import java.io.File;  

import java.io.FileReader;  

import java.io.IOException;  

import java.io.Reader;  

import java.util.ArrayList;  

import java.util.List;  

  

import javax.xml.stream.XMLInputFactory;  

import javax.xml.stream.XMLStreamConstants;  

import javax.xml.stream.XMLStreamException;  

import javax.xml.stream.XMLStreamReader;  

  

import com.bean.Item;  

import com.bean.Ref;  

  

public class StaxTest {  

    //基于事件流的方式来做的,通过使用流的API,像指针一样的来处理文档,每一个节点都可以返回一个事件。处理完以后由JVM来回收内存。  

    public static void main(String[] args) throws IOException,  

            XMLStreamException {  

  

        StaxTest test = new StaxTest();  

        File file = new File("src/test.xml");  

        test.read(file);  

    }  

  

    public void read(File file) throws IOException, XMLStreamException {  

        Long time = null;  

        XMLInputFactory factory = XMLInputFactory.newInstance();  

        Reader fileReader = new FileReader(file);  

        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);  

        XMLStreamReader reader = factory.createXMLStreamReader(fileReader);  

        try {  

            int event = reader.getEventType();//获取节点类型,结果是以整形的方式返回的。  

  

            //这里的3个对象是具体的POJO  

            Item item = null;  

            Ref ref = null;  

            List<Ref> refList = null;//用来存放POJO的集合  

  

            while (true) {  

                switch (event) {  

                case XMLStreamConstants.START_DOCUMENT://表示的是文档的开通节点。  

                    time = System.currentTimeMillis();  

                    break;  

                case XMLStreamConstants.START_ELEMENT://开始解析开始节点  

                    if (reader.getLocalName().equals("item")) {//判断节点的名字  

                        item = new Item();//实例化一个节点POJO类  

                        refList = new ArrayList<Ref>();  

  

                        //给节点赋值  

                        item.setType(reader.getAttributeValue(0));//getAttributeValue(index)获取属性的值,可能有多个属性。  

                        item.setName(reader.getAttributeValue(1));  

                        item.setSeq(reader.getAttributeValue(2));  

  

                    }  

  

                    if (reader.getLocalName().equals("status")) {  

  

                        item.setStatus(reader.getElementText());  

  

                    }  

  

                    if (reader.getLocalName().equals("desc")) {  

                        item.setDesc(reader.getElementText());  

  

                    }  

  

                    if (reader.getLocalName().equals("ref")) {  

  

                        ref = new Ref();  

                        ref.setSource(reader.getAttributeValue(0));  

                        if (reader.getAttributeCount() > 2) {  

                            ref.setUrl(reader.getAttributeValue(1));  

                        }  

                        ref.setText(reader.getElementText());  

                        System.out.println("-----------refs--ref-------------");  

  

                        if (reader.getAttributeCount() > 2) {  

                            System.out.println("url: "  

                                    + reader.getAttributeValue(1));  

                        }  

  

                    }  

                    break;  

  

                case XMLStreamConstants.CHARACTERS:  

                    // if(reader.isWhiteSpace())  

                    // break;  

                    break;  

                    //文档的结束元素  

                case XMLStreamConstants.END_ELEMENT:  

                    if (reader.getLocalName().equals("item")) {  

                        item.setRefList(refList);  

                    }  

  

                    break;  

                    //文档的结束。  

                case XMLStreamConstants.END_DOCUMENT:  

                    System.out.println("-----------end Document--------");  

                    time = System.currentTimeMillis() - time;  

                    System.out.println("耗时: " + time + "毫秒");  

                    break;  

                }  

  

                if (!reader.hasNext()) {  

                    break;  

                }  

                event = reader.next();  

            }  

        } finally {  

            reader.close();  

        }  

    }  

  

}  

 3使用的其它类POJO

Java代码  


public class Item implements Serializable {  

  

    /** 

     *  

     */  

    private static final long serialVersionUID = 1L;  

    private String type;  

    private String name;  

    private String seq;  

    private String status;  

    private String desc;  

    private List<Ref> refList = new ArrayList<Ref>();  

  

    public String getType() {  

        return type;  

    }  

  

    public void setType(String type) {  

        this.type = type;  

    }  

        ..................................  

 

Java代码  


private static final long serialVersionUID = 1L;  

    private String source;  

    private String url;  

    private String text;  

  

    public String getSource() {  

        return source;  

    }  

  

    public void setSource(String source) {  

        this.source = source;  

    }  

   ............................  

 4 使用的jar 包 stax-1.2.0.jar

                      stax-api-1.0.1.jar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: