zoukankan      html  css  js  c++  java
  • 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;
    
        }
    
    }
  • 相关阅读:
    基本数据类型(二)
    jquery 基础
    CSS 基础
    Hyperledger Fabric Ordering Service过程
    Hyperledger Fabric Transaction Proposal过程
    Hyperledger Chaincode启动过程
    Hyperledger Fabric1.0 整体结构
    golang学习
    数字签名详解
    设置MongoDB课程环境
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4725533.html
Copyright © 2011-2022 走看看