Xml文件之解析

这里写图片描述
XML之Sax(simple api for xml )解析:

主实现类:

package com.xml;

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

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

import org.junit.Test;
import org.xml.sax.SAXException;
/*
 * Sex解析的特点:
 * 1.基于事件的读取
 * 2.基于顺序的读取,速度快
 * 3.不能任意读取节点(灵活性差一些)
 * 4.sex更适用于在要求跟高的设备上使用(Android开发中);
 * 5.解析时占用内存小
 */
public class ImplementsXML {

    @Test
    public static void saxparsemxl() {
        //1.创建一个sax解析工厂对象
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //2.通过工厂对象创建sax解析器
        try {

         SAXParser sp=  spf.newSAXParser();
         //3.创建一个数据处理器(需要我们自己来编写)
        dataParser dp=new dataParser();
        //4.开启解析
        InputStream is= Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");

        try {
            //参数一输入文件字节流 /参数二 自己编写的数据处理器
            sp.parse(is,dp);
        ArrayList<person>   p=dp.getPersons();
        //通过for循环输出对象   
        for(person p1:p) {
                System.out.println(p1);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

    public static void main(String[] args) {
        //调用解析xml的方法
        saxparsemxl();
    }
}

数据处理器类:

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

public class dataParser extends DefaultHandler {
    private ArrayList<person> persons=new ArrayList<person>();
    private person p;//当前正在解析的person对象
    private String tag;//用于记录正在解析的标签名

    public ArrayList<person> getPersons() {
        return persons;
    }

    @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("文档解析结束.");
    }
    //解析开始元素时调用
    /*
     * String 命名空间, String 不带前缀的标签名字, String 不带前缀的标签名字, Attributes 当前标签的属性集合
     */
    @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);
        //表示解析到了person标签
        if("person".equals(qName)) {
            p=new person();
            String id=attributes.getValue("person");
            //设置id
            p.setId(id);
        }
        tag=qName;
        System.out.println("startElement"+qName);
    }
    //解析结束元素时调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        if("person".equals(qName)) {
            persons.add(p);
            tag=null;
        }
        System.out.println("endElement"+qName);
    }
    //解析文本时调用

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        if(tag !=null) {
            if("name".equals(tag)){
                p.setName(new String(ch,start,length));
            }else if("address".equals(tag)) {
                p.setAddress(new String (ch,start,length));
            }else if("tel".equals(tag)) {
                p.setTel(new String (ch,start,length));
            }else if("fax".equals(tag)) {
                p.setFax(new String (ch,start,length));
            }else if("email".equals("tag")) {
                p.setEmail(new String (ch,start,length));
            }
        }
        System.out.println(ch);
    }


}

解析的对象person类

package com.xml;

public class person {

    private String name;
    private String address;
    private String email;
    private String tel;
    private String fax;
    private String id;

    public person() {
        super();
        // TODO Auto-generated constructor stub
    }

    public person(String name, String address, String email, String tel, String fax, String id) {
        super();
        this.name = name;
        this.address = address;
        this.email = email;
        this.tel = tel;
        this.fax = fax;
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "person [name=" + name + ", address=" + address + ", email=" + email + ", tel=" + tel + ", fax=" + fax
                + ", id=" + id + "]";
    }

}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<persion>
    <person id="p1">
            <name>小红</name>
            <address>上海</address>
            <tel>100886</tel>
            <fax>001100</fax>
            <email>[email protected]</email>
    </person> 

    <person id="p2">
            <name>小明</name>
            <address>上海</address>
            <tel>189886</tel>
            <fax>011110</fax>
            <email>[email protected]</email>
    </person>
</persion>

XML之Dom(document Object Modo)解析:

package com.xml;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*
 * DOM解析mxl
 * 1.基于树形结构,通过解析器一次性把文档加载到内存中,
 * 会比较占用内存,可以随机访问,跟适用于web开发中使用
 */
public class domeParserXml {

    public static void parset() {
        //1.创建一个dom解析器工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2.通过工厂对象创建解析器对象

        //4.从内存中读取数据
        try {
            DocumentBuilder db=factory.newDocumentBuilder();
        //3.解析文档
            InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
            try {
        //此代码执行后整个xml已经加载到内存当中,以树状形式存储  
        Document doc=db.parse(is);//通过解析器进行解析
        //返回一个NodeList节点
        person p=null;
        NodeList  nl=doc.getElementsByTagName("person");        
            ArrayList<person> persons=new ArrayList<>();
            //遍历NodeList节点
            //获取属性值
            for(int i=0;i<nl.getLength();i++) {
                Node personNode=nl.item(i);
                p=new person();
            String   s=personNode.getAttributes().getNamedItem("id").getNodeValue();
            p.setId(s);
            //获取当前节点的所有子节点
        NodeList childNodel=doc.getChildNodes();
            for(int j=0;j<childNodel.getLength();j++) {
            Node item=childNodel.item(j);
            String nodename=item.getNodeName();
            if("name".equals(nodename)) {
                p.setName(item.getFirstChild().getNodeValue());
            }else if("address".equals(nodename)) {
                p.setAddress(item.getFirstChild().getNodeValue());

            }else if("email".equals(nodename)) {
                p.setEmail(item.getFirstChild().getNodeValue());
            }else if("fax".equals(nodename)) {
                p.setFax(item.getFirstChild().getNodeValue());
            }else if("tel".equals(nodename)) {
                p.setTel(item.getFirstChild().getNodeValue());
            }
            persons.add(p);
            }
            for(person person:persons) {
                System.out.println(person);
            }

            }
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    public static void main(String[] args) {
        parset();

    }
}

XML之JDom(java document Object Modo)解析:

package com.xml;

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

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/*
 * JDOM解析 xml
 * 1.于dom类似,都是基于树形结构
 * 2.于dom的区别
 *  (1)第三方开源的组件
 *  (2)实现使用java的collection接口
 *  (3)效率比DOM更快
 * 
 */
public class JDomParserXml {

    public static void parser() {
        //创建JDOM解析器
        //注意他不是SAX,只是名字叫SAX
        SAXBuilder sb=new SAXBuilder();
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
        try {
            //开始解析
        Document    build=sb.build(is);
        //获取根节点
        Element rootelemnt =build.getRootElement();
            List<person> list=new ArrayList<>();
            person person=null;
        //根节点根节点获取子元素:返回list person对象集合
            List<Element> childList=rootelemnt.getChildren();
            for(Element element:childList ) {
                person=new person();
                String id=element.getAttributeValue("id");
                person.setId(id);
            List<Element> ChildrenList= element.getChildren();
                for(Element e:ChildrenList ) {
                    //取到标签名字
                    String tag=e.getName();
                    if("name".equals(tag)) {
                        person.setName(e.getText());

                    }else if("address".equals(tag)) {
                        person.setAddress(e.getText());
                    }else if("email".equals(tag)) {
                        person.setEmail(e.getText());
                    }else if("fax".equals(tag)) {
                        person.setFax(e.getText());
                    }else if("tel".equals(tag)) {
                        person.setTel(e.getText());
                    }
                }

                list.add(person);
            }

            for(person p:list) {
                System.out.println(p);
            }
        } catch (JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        parser();
    }

}

XML之Dom4J(document Object Modo for java)解析:

注意4j不念4,而是读for

package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
 * JDOM解析 xml
 * 1.于DOM,都是基于树形结构
 * 2.于第三方开源的组件,效率比DOM更快
 * 3.JDOM和DOM在性能测试时性能表示不加,在测试10m文档时内存溢出
 * SAX表现较好,这事依赖与它的解析特性
 * DOM4J是这场测试的获胜者
 */
public class dom4jparser {

    public static void parser() throws IOException {

        //创建DOM4j解析器
        SAXReader reader=new SAXReader();
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
        try {
            //返回 DOM4j包中的的 document对象
            Document dc=reader.read(is);
            Element rootelement=dc.getRootElement();
            //获取迭代器
        Iterator<Element> iterator=rootelement.elementIterator();
            ArrayList<person> personList=new ArrayList<>();
            person p=null;
            //循环素如
            while(iterator.hasNext()) {
                p=new person();
                Element e=iterator.next();
                p.setId(e.attributeValue("id"));
                //Iterator<Element> iterator1 = null;
                while(iterator.hasNext()) {
                    Element name=iterator.next();
                    String tag=name.getName();
                    if("name".equals(tag)) {
                        p.setName(name.getText());
                    }else if("address".equals(tag)) {
                        p.setAddress(name.getText());
                    }else if("email".equals(tag)) {
                        p.setEmail(name.getText());
                    }else if("fax".equals(tag)) {
                        p.setFax(name.getText());
                    }else if("tel".equals(tag)) {
                        p.setTel(name.getText());
                    }
                }
                personList.add(p);

            }
            for(person pp:personList) {
                System.out.println(pp);
            }

        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {

        try {
            parser();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

XmlDecoder和XmlEncoder解析xml文件

package com.xml;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class xmlDome {
//**************************XML编码方法***************************
    public static void xmlEnCoder() {
        OutputStream out = null;
        try {
            out = new FileOutputStream("C:\\Users\\龙布天下\\Desktop\\long.xml");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedOutputStream bos=new BufferedOutputStream(out);
        //创建编码器
        XMLEncoder xmlEncoder=new XMLEncoder(out);
        person p=new person();
        p.setName("小亮");
        p.setAddress("上海");
        p.setEmail("[email protected]");
        p.setFax("05112");
        p.setTel("100990");
        p.setId("01");
        xmlEncoder.writeObject(p);
        xmlEncoder.close();
    }
//**************************XML解码方法***************************
    public static void xmlDeCoder() {
        InputStream in = null;
        try {
            in = new FileInputStream("C:\\Users\\龙布天下\\Desktop\\long.xml");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        XMLDecoder xmlDecoder=new XMLDecoder(in);
        person p=(person) xmlDecoder.readObject();
        System.out.println(p);
    }

    public static void main(String[] args) {
        //调用编码方法
        xmlEnCoder();
        //调用解码方法
        xmlDeCoder();
    }
}

XStream工具解析xml文件

package com.xml;

import com.thoughtworks.xstream.io.xml.Xpp3DomDriver;
/*
 * 使用xStream工具实现XML的解析与生成
 */
public class XStream {

    public static void XStream() {
        person p=new person();
        p.setName("小亮");
        p.setAddress("上海");
        p.setEmail("[email protected]");
        p.setFax("05112");
        p.setTel("100990");
        p.setId("01");
        //创建XPP驱动
        //Xpp3DomDriver xpp=new Xpp3DomDriver();
        com.thoughtworks.xstream.XStream x=new com.thoughtworks.xstream.XStream(new Xpp3DomDriver());
        //根节点取别名
        x.alias("person",person.class);
        //属性值取别名
        x.useAttributeFor(person.class,"id");
        String s=x.toXML(p);

        System.out.println(s);
        //注意!!!!!!!!!!!!!!!!开始解析;
        //返回person对象
        person person=(com.xml.person) x.fromXML(s);
        System.out.println(person);
    }

    public static void main(String[] args) {
        //调用方法
        XStream();




    }
}

**

xml常用四种解析方式优缺点的分析

**


    xml

      最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下。

首先介绍一下xml语言:

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

xml的语法:

XML 分为两部分:头信息,主体信息

头信息是用来描述 XML 的一些属性,例如:版本,编码等,还可以提供 XML 显示的样式,和 dtd 编写格式。

主体信息中包含的是 XML 的具体数据。



头信息的语法:

<?xml version =”1.0” encoding =”GBK” ?>

其中 version 是必须加的,而 encoding 可以不写,则默认编码是 ISO8859-1 ,不支持中文。

除了这个功能外,头信息还可以进行编写格式的规定,通过 dtd 或 xsd 文件。

头信息还支持样式表的导入,允许通过样式表控制 XML 的显示。

这样可以使用 XML+ CSS 完成页面的显示,通过这种形式完成 MVC 中的 View 层:

优点:代码的安全性很高,可以很容易的替换模板。

缺点:开发成本太高

主体信息 就是由三种节点组成的,节点之间存在父与子的关系,注意的点:

  一个节点只能有一个父节点,如果没有父节点,该节点称为根节点。

  一个节点可以有多个子节点。只有元素节点可以拥有子节点。

  元素节点的标记必须成对出现,或直接结束。

特殊字符必须转义。依据字符所处的位置是否对 XML 格式造成影响来决定是否进行转义

根节点只能有一个

xml常用的四种解析方式:

1)DOM(Document Object Model)

文档对象模型分析方式。以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分。是W3C的官方标准。

优点:
1、允许应用程序对数据和结构做出更改。
2、访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。

缺点:
1、通常需要加载整个XML文档来构造层次结构,消耗资源大

2)SAX(Simple API for XML)

流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。

优点:
1、不需要等待所有数据都被处理,分析就能立即开始。
2、只在读取数据时检查数据,不需要保存在内存中。
3、可以在某个条件得到满足时停止解析,不必解析整个文档。
4、效率和性能较高,能解析大于系统内存的文档。

缺点:
1、需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),使用麻烦。
2、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。

3)JDOM(Java-based Document Object Model)

Java特定的文档对象模型。自身不包含解析器,使用SAX。

优点:
1、使用具体类而不是接口,简化了DOM的API。
2、大量使用了Java集合类,方便了Java开发人员。

缺点:
1、没有较好的灵活性。
2、性能较差。

4)DOM4J(Document Object Model for Java)

简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP。

优点:
1、大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
2、支持XPath。
3、有很好的性能。

缺点:
1、大量使用了接口,API较为复杂。
发布了140 篇原创文章 · 获赞 42 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章