一只纯菜鸟的角度....持续更新中。一如既往,求指教,求更正。
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下载。