Java 手动解析xml数据

前言:开发过程中用到极少,不过还是在这做个记录。 小伙伴们周末愉快☺。
原文出处:http://blog.csdn.net/u014158743/article/details/52963527

公司里跟服务器基本都是用json数据进行数据交互,用xml的还真是少。不过抱着负责任的态度(- -!),咳咳。。。还是上tomcat吧。用tomcat模拟服务器,在服务器端的MyHttp工程目录下存在person.xml。本地访问服务器得到xml数据后分别进行pull和sax解析。

服务器端的person.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<persons>
    <person id = "23">
        <name>张老师</name>
        <age>21</age>
    </person>
    <person id = "20">
        <name>李老师</name>
        <age>25</age>
    </person>
</persons>

pull解析PullParser.java

public class PullParser {

    public List<Person>  parser(String path) throws XmlPullParserException, IOException {
        List<Person> list = null;
        Person person = null;

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();


        InputStream in = HttpUtil.getInputStream(path);
        parser.setInput(in, "utf-8");

        int event = parser.getEventType();
        while(event!=XmlPullParser.END_DOCUMENT) {
            switch(event) {
            case XmlPullParser.START_DOCUMENT:
                list = new ArrayList<Person>();break;
            case XmlPullParser.START_TAG:
                String tagName = parser.getName();
                if("person".equals(tagName)) {
                    person = new Person();
                    int count = parser.getAttributeCount();
                    for(int i=0;i<count;i++) {
                        String atrrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if("id".equals(atrrName))
                            person.setId(attrValue);
                    }
                } else if("name".equals(tagName)) {
                    person.setName(parser.nextText());
                } else if("age".equals(tagName)) {
                    person.setAge(Integer.parseInt(parser.nextText()));
                }
                break;
            case XmlPullParser.END_TAG:
                if("person".equals(parser.getName()))
                    list.add(person);
                break;

            }
            event = parser.next();
        }
        return list;

    }

}

sax解析MyHandler.java

public class MyHandler extends DefaultHandler {

    private List<Person> list;
    private Person person;
    private String tagName;

    @Override
    public void startDocument() throws SAXException {
        list = new ArrayList<Person>();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        tagName = qName;
        if("person".equals(qName)) {
            person = new Person();
            for(int i=0;i<attributes.getLength();i++) {
                String attrName = attributes.getQName(i);
                String attrValue = attributes.getValue(i);
                if("id".equals(attrName))
                    person.setId(attrValue);
            }
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String data = new String(ch,start,length);
        if("name".equals(tagName))
            person.setName(data);
        else if("age".equals(tagName))
            person.setAge(Integer.parseInt(data));
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        tagName = null;
        if("person".equals(qName))
            list.add(person);

    }

    @Override
    public void endDocument() throws SAXException {

    }

    public List<Person> getList() {
        return list;
    } 
}

本地用来存放数据的实体类Person.java

public class Person {

    private String id;
    private String name;
    private int age;

    public Person() {
        // TODO Auto-generated constructor stub
    }

    public Person(String id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

}

访问模拟服务器的工具类HttpUtil.java

public class HttpUtil {

    public static InputStream getInputStream(String path) throws IOException {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        conn.setDoInput(true);

        conn.connect();
        InputStream in =null;
        if(conn.getResponseCode()==200) {
            in = conn.getInputStream();
        }
        return in;

    }

}

程序入口

最后调用

/**pull*/
public static void main(String[] args) throws XmlPullParserException, IOException {

    String path = "http://localhost:8080/MyHttp/person.xml";

    PullParser parser = new PullParser();

    List<Person> list =parser.parser(path);

    for(Person person:list) {
        System.out.println(person);
    }
}
/**sax*/
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

    String path = "http://localhost:8080/MyHttp/person.xml";
    SAXParserFactory factory = SAXParserFactory.newInstance();

    SAXParser parser =factory.newSAXParser();

    InputStream in = HttpUtil.getInputStream(path);
    MyHandler handler = new MyHandler();

    parser.parse(in, handler);

    List<Person> list = handler.getList();
    for(Person person:list) {
        System.out.println(person);
    }
}

猜你喜欢

转载自blog.csdn.net/u014158743/article/details/52963527