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下载。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |