JAVA解析XML文件(二)---SAX方式解析

本文介绍如何使用SAX方式解析XML文件,包括XML文件内容解析与JAVA代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA解析XML文件(二)—SAX方式解析

1.XML文件内容:


<?xml version="1.0"  encoding="UTF-8"?>
<bookstore>
    <book id="1">
        <name>冰与火之歌</name>
        <author>乔治·马丁</author>
        <year>2015</year>
        <price>200</price>
    </book>
    <book id="2">
        <name>光荣与梦想</name>
        <year>2004</year>
        <price>150</price>
        <publish>科学出版社</publish>
    </book>
</bookstore>

2.JAVA代码:

(1)新建一个类对Handler方法重写

 public class SAXParserHandler extends DefaultHandler {
    int bookIndex = 0;
    String value = null;
    Book book = null;
    private ArrayList<Book> bookList = new ArrayList<Book>();

    public ArrayList<Book> getBookList() {
        return bookList;
    }

    /**
     * 用来标示解析开始
     */
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
        System.out.println("解析开始");
    }

    /**
     * 用来标示解析结束
     */
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("解析完成");
    }

    /**
     * 用于遍历xml的开始标签
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("book")) {
            bookList.add(book);
            book = null;
            bookIndex++;
            // 创建一个Book对象,用来接收解析到的元素和节点
            book = new Book();
            System.out.println("================开始遍历第" + bookIndex
                    + "本书的内容=================");
            // //已知book标签有有一个属性为id时,调用getValue方法即可
            // String value = attributes.getValue("id");
            // System.out.println("book标签的属性值为:"+ value);

            // 不知道book标签的属性及个数时,可通过索引遍历,方法如下
            int num = attributes.getLength();
            System.out.println("book标签共有" + num + "个属性:");
            for (int i = 0; i < num; i++) {
                // 通过遍历索引来获取属性的名称和值
                System.out.print("第" + (i + 1) + "个属性的名称是:"
                        + attributes.getQName(i));
                System.out.println("--->它的属性值是:" + attributes.getValue(i));

                // 将获取的属性值赋给book对象中的id属性
                if (attributes.getQName(i).equals("id")) {
                    book.setId(attributes.getValue(i));
                }
            }
        }

        else if (!(qName.equals("book") || qName.equals("bookstore"))) {
            // 获取节点名
            System.out.print("节点名是:" + qName);
            // 将获取到的节点属性值赋给相应的节点
        }
    }

    /**
     * 用于遍历xml的结束标签
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        if (qName.equals("book")) {
            book = null;
            System.out.println("================结束遍历第" + bookIndex
                    + "本书的内容=================");
        } else if (qName.equals("")) {
            System.out.println("出错了,写的什么屎玩意儿!!!");
        } else if (qName.equals("name")) {
            book.setName(value);
        //  System.out.println("名称已写入"+book.getName());
        } else if (qName.equals("author")) {
            book.setAuthor(value);
        } else if (qName.equals("year")) {
            book.setYear(value);
        } else if (qName.equals("price")) {
            book.setPrice(value);
        } else if (qName.equals("publish")) {
            book.setPublish(value);
        }
    }

    /**
     * 用于获取节点的值
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        // 获取节点值
        value = new String(ch, start, length);
        if (!value.trim().equals("")) {
            System.out.println("--->它的值是:" + value);
        }
    }

(2)新建SAX解析方法进行解析

public ArrayList<Book> SAXParseXML() {
        // 通过SAXParserFactory的newInstance方法创建一个实例
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParserHandler handler = null;
        try {
            // 通过factory的newSAXParser方法创建一个SAXParser实例
            SAXParser parser = factory.newSAXParser();
            // 创建一个SAXParserHandler对象,SAXParserHandler类继承自DefaultHandler,里边重载了一些方法
            handler = new SAXParserHandler();
            // 通过parser的parse方法解析目标xml文件
            parser.parse("MyXML.xml", handler);
            return handler.getBookList();

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return handler.getBookList();

    }

(3)main()方法调用

    public static void main(String[] args) {

        SAXTest st = new SAXTest();
        st.SAXParseXML();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值