JAVA 中XML的解析

XML:  可扩展标记语言(extensible Markup Language)

  用于标记电子文件使其具有结构性的标记语言。XML可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

xml语言示例:

<?xml version ="1.0" encoding="utf-8" ?>     =》》这个必须要有
<persons>
  <person id="01">
    <name>李鹏</name>
    <age>22</age>
    <sex>男</sex>
  </person>
  <person id="02">
    <name>李四</name>
    <age>23</age>
    <sex>女</sex>
  </person>
</persons>

xml的解析方法:

 1:SAX解析

  MyHandler类,负责解析xml文档将查找的值使用面向对象思想放在对象列表中==》必须要继承DefaultHandler类

package sax;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

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>(); 
    }

    //解析到开始标签时,执行该方法,qName参数用来接收标签名字
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
    {
        tagName = qName;
        if("person".equals(qName))
        {
            person = new Person();
            if(attributes !=null)
            {
                //解析标签中的内容 如:<person id="01"> 中的id
                for(int i =0;i<attributes.getLength();i++)
                {
                    String name = attributes.getQName(i);
                    String value = attributes.getValue(i);
                    if("id".equals(name))
                    {
                        person.setId(Integer.parseInt(value));
                    }
                }
            }
        }
        
    }
    //解析到标签内容时,执行该方法,解析到的标签内容传给了参数ch
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException
    {
        String str = new String(ch,start,length);
        if("name".equals(tagName))
            person.setName(str);
        else if("age".equals(tagName))
            person.setAge(Integer.parseInt(str));
        else if("sex".equals(tagName))
            person.setSex(str);
        
    }
    //解析到结束标签时,执行该方法,qName接收标签名称
    @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;
    }


}

Test类:负责建立解析器,建立解析器使用的读取类和读取流,读取到数据并显示在客户端,其中的HttpUtil类在上篇博客中有

package sax;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class Test
{

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
    {
        //创建Sax解析工厂对象
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //创建Sax解析器对象---具备解析功能的对象
        SAXParser parser = factory.newSAXParser();
        
        String path = "http://localhost:9999/day16/user2.xml";
        //创建被解析的文件的读取流
        InputStream in = HttpUtil.getInputStram(path);
        //创建MyHandler对象
        MyHandler handler = new MyHandler(); 
        //解析器使用文件字节读取流读取文件,读取的过程中调用handler中的方法
        parser.parse(in,handler);
        //获取集合
        List<Person> list = handler.getList();
        
        for(Person per:list)
        {
            System.out.println(per);
        }
    }

}

 2:PULL解析 ==》直接返回解析得到的list列表

package PULL;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class Pull
{
    public static List<Person> pullParser(InputStream in)
            throws XmlPullParserException, NumberFormatException, IOException
    {
        List<Person> list = null;
        Person person = null;
        //创建pull解析工厂类对象
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //创建pull解析器对象
        XmlPullParser parser = factory.newPullParser();
        //创建被解析文件的读取流对象
        InputStream input = in;
        parser.setInput(input,"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 attrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if ("id".equals(attrName))
                            person.setId(Integer.parseInt(attrValue));
                    }
                } else if ("age".equals(tagName))
                    person.setAge(Integer.parseInt(parser.nextText()));
                else if ("sex".equals(tagName))
                    person.setSex(parser.nextText());
                else if("name".equals(tagName))
                    person.setName(parser.nextText());
                break;
            case XmlPullParser.END_TAG:
                if ("person".equals(parser.getName()))
                    list.add(person);
                break;
            }
            //得到下一个编号
            event = parser.next();
        }
        return list;

    }

}
原文地址:https://www.cnblogs.com/lipeng0824/p/4725533.html