XML学习3 xml的解析

一只纯菜鸟的角度....持续更新中。一如既往,求指教,求更正。

 

Xml的解析目的:读出xml的信息为我所用,yy地说可以拿来配置系统好处是:,拿来进行网络传输,数据交换等。没有用代码实现过职能yy了。

先介绍下将要展示的三种解析方式:

 

DOM解析:把整个xml文件读入内存,虽然占内存,但处理能进行随机访问,并且处理前后相关的元素时很方便。(哪位能举个实例告诉我什么是前后相关的元素?)

SAX解析: 以事件驱动,它为每个元素、标签、内容都定义一个回调方法,在读取时以流的形式读取xml,遇到元素、标签、内容就调用相应的方法。优点是处理高效,缺点是只能对xml进行读操作不能写,而且处理前后相关的元素不太方便。

JDOM解析: DOM解析非常类似,但效率要高些。

DOM4J: 大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。使用最多,性能最好。

在写代码之前先找到相关的jar包,本文用到的jar包、相关API和资料在文章最后的连接中有下载。

-------------------------------------------xml文件

<?xml version="1.0" encoding="UTF-8"?>

<students>

    <student stuid="101">

        <name>曾花卷</name>

        <age>23</age>

        <address>毛里求斯</address>

    </student>

    <student stuid="121">

        <name>白馒头</name>

        <age>23</age>

        <address>夏威夷</address>

    </student>

    <student stuid="131">

        <name>鬼见愁</name>

        <age>13</age>

        <address>好望角</address>

    </student>

    <student stuid="141">

        <name>mick</name>

        <age>23</age>

        <address>卢旺达</address>

    </student>

</students>

----------------------对应的学生类,get/set方法自己补上

 

 

package cn.bl.entity;

 

publicclass Student {

    private String stuID;

    private String stuName;

    privateintage;

    private String stuAddress;

    ..............

    @Override

    public String toString() {

        // TODO Auto-generated method stub

        return"id:"+stuID+姓名:"+stuName+地址:"+stuAddress;

    }

   

   

}

 

 

------------------------测试dom4j

publicclass TestDom4j {

    publicstaticvoid main(String[] args) {

        SAXReader reader=new SAXReader();

        try {

            //-------由API可知read可以读流、文件、url...--------------

        //  InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("stu.xml");

        //System.out.println(in);

        //Document doc=reader.read(in);

            //注意xml文件的路径

            //--------------------

           

            Document doc=reader.read("stu.xml");

            Element root=doc.getRootElement();

            Student s=new Student();

            //root.elements("元素名")返回的是element元素,可参考附件dom4j的API

            List<Element> list=root.elements("student");

            for(Element e:list)

            {  

                s.setStuID(e.attribute("stuid").getValue());

                s.setStuName(e.elementText("name"));

                s.setAge(Integer.parseInt(e.elementText("age")));

                s.setStuAddress(e.elementText("address"));

                System.out.println(s);

            }

        } catch (DocumentException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            System.out.println("dom4j读取文件异常");

        }

       

    }

}

 

---------------测试jdom

publicclass JdomTest {

    publicstaticvoid main(String[] args) throws JDOMException, IOException {

    //  readXML();

        writeIn();

       

    }

 

    publicstaticvoid writeIn() throws FileNotFoundException, IOException {

        Document doc=new Document();

        //创建根节点

        Element root=new Element("students");

        doc.setRootElement(root);

        Student stu1=new Student();

        stu1.setStuName("张三");

        stu1.setAge(14);

        stu1.setStuID("4w2");

        stu1.setStuAddress("天涯");

        Student stu2=new Student();

        stu2.setStuID("4sdd");

        stu2.setStuName("李四");

        stu2.setAge(23);

        stu2.setStuAddress("海角");

       

        //创建子节点

        Element node1=new Element("student");

        //初始化学生的id属性

        node1.setAttribute("stuid", stu1.getStuID());

        //初始化学生的子元素

        node1.addContent(new Element("name").setText(stu1.getStuName()));

        node1.addContent(new Element("age").setText(String.valueOf(stu1.getAge())));

        node1.addContent(new Element("address").setText(stu1.getStuAddress()));

        //将子节点加到根节点上

        root.addContent(node1);

       

        //写入xml文件,可以new一个新的xml文件也可以写入已有的xml文件这里我测试写入新的文件

       

        XMLOutputter outputer=new  XMLOutputter();

        //获得格式化工具

          Format format=Format.getPrettyFormat();

          format.setEncoding("GBK");

          outputer.setFormat(format);

          FileOutputStream fos=new FileOutputStream("stu.xml");

          outputer.output(doc, fos);

          System.out.println("写入完成!");

    }

 

    //读取xml

    publicstaticvoid readXML() throws JDOMException, IOException {

        // JDOM自身不包含解析器,所以先要搞个解析器

        SAXBuilder parser = new SAXBuilder();

        //获取解析到的document对象

        Document doc=parser.build("stu.xml");

        //获取根元素

        Element root=doc.getRootElement();

        //通过根获取子元素-------------------------最好用反射来做,目前不会,以后更新

        List<Element> list=root.getChildren();

        Student s=new Student();

        for(Element e:list){

            s.setStuID(e.getAttribute("stuid").getValue());

            s.setStuName(e.getChildText("name"));

            s.setAge(Integer.parseInt(e.getChildText("age")));

            s.setStuAddress(e.getChildText("address"));

            System.out.println(s);

        }

    }

}

 

 

 

 

----------------运行结果均正确

id:101  姓名:曾花卷  地址:毛里求斯

id:121  姓名:白馒头  地址:夏威夷

id:131  姓名:鬼见愁  地址:好望角

id:141  姓名:mick  地址:卢旺达

 

本文的相关参考资料、源码,请到http://download.csdn.net/my下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值