当前位置: 首页 > 工具软件 > SAX for .NET > 使用案例 >

使用SAX解析XML

宓英哲
2023-12-01

SAX也是Java官方提供的解析XML的工具之一,使用SAX解析XML不需要导入额外的包。个人觉得使用SAX解析相对麻烦一些(包括使用DOM也是)。废话不多说,还是以demo.xml为例,直接上代码:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="person1" >
        <name>simons</name>
        <sex>男</sex>      
        <age>24</age>
        <address>魔都</address> 
	</person>
    <person id="person2" >
       <name>rose</name>
        <sex>女</sex>      
        <age>22</age>
        <address>帝都</address> 
	</person>
</persons>

使用SAX需要额自定义Handler继承DefaultHandler,重写相应的方法逻辑

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;

public class SaxParseHandler extends DefaultHandler {

    Person person = null;
    String value = null;
    private List<Person> personList = new ArrayList<>();

    public List<Person> getPersonList() {
        return personList;
    }
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //解析person节点属性值
        if (qName.equals("person")) {
            person = new Person();
            int attrLength = attributes.getLength();
            for (int i = 0; i < attrLength; i++) {
                String qName1 = attributes.getQName(i);
                String value = attributes.getValue(i);
                System.out.println(qName1 + ":" + value);
            }
        } else if (!qName.equals("persons") && !qName.equals("person")) {
            System.out.print("节点名称=" + qName);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if(qName.equals("person")){
            personList.add(person);
            person=null;
        }else if (qName.equals("name")) {
            person.setName(value);
        } else if (qName.equals("sex")) {
            person.setSex(value);
        } else if (qName.equals("age")) {
            person.setAge(value);
        } else if (qName.equals("address")) {
            person.setAddress(value);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        value = new String(ch, start, length);
        if (!value.trim().equals("")) {
            System.out.println("节点值=" + value);
        }
    }

    public static SaxParseHandler newInstance() {
        return new SaxParseHandler();
    }
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxParseXml {
    public static void main(String[] args) throws Exception {
        SAXParserFactory saxParserFactory =SAXParserFactory.newInstance();
        SAXParser saxParser = saxParserFactory.newSAXParser();
        SaxParseHandler saxParseHandler = SaxParseHandler.newInstance();
        //你也可以将demo.xml放在resources目录下,然后通过下面方式获取
        //InputStream resourceAsStream = SaxParseXml .class.getClassLoader().getResourceAsStream("demo.xml");
        //saxParser.parse(resourceAsStream,saxParseHandler);
        saxParser.parse("D:/demo.xml",saxParseHandler);
        System.out.println(saxParseHandler.getPersonList().toString());
    }
}

下面的@Data是lombok里面的,如果你没有使用过,请移步这里:https://blog.csdn.net/fanrenxiang/article/details/78319711

import lombok.Data;

@Data
public class Person {
    private String name;
    private String age;
    private String sex;
    private String address;
}

运行上述代码,结果如下:

id:person1
节点名称=name节点值=simons
节点名称=sex节点值=男
节点名称=age节点值=24
节点名称=address节点值=魔都
id:person2
节点名称=name节点值=rose
节点名称=sex节点值=女
节点名称=age节点值=22
节点名称=address节点值=帝都
[Person(name=simons, age=24, sex=男, address=魔都), Person(name=rose, age=22, sex=女, address=帝都)]

顺利解析demo.xml,并把解析后的数据封装到了集合中。

引申阅读:

使用JDOM解析XML:https://blog.csdn.net/fanrenxiang/article/details/81100740

使用DOM4J解析XML:https://blog.csdn.net/fanrenxiang/article/details/81099346

使用DOM解析XML:https://blog.csdn.net/fanrenxiang/article/details/81078854

 类似资料: