XML学习3 xml的解析

前端之家收集整理的这篇文章主要介绍了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下载。

原文链接:https://www.f2er.com/xml/300231.html

猜你在找的XML相关文章