在这以前我是有点怕xml文件的,现在知道之所以怕是源于未知。人们都会对未知的东西恐慌,克服这种恐慌最好的办法就是接近它,不光是对于技术学习,生活中也是这样。我想通过读这篇文章,下次再见到问题的时候,你的第一个想法是:“不过是个技术问题,别人能创造出来,我还能不会用吗?”。这就好像那些军事家说的“在战略上藐视对手,在战术上重视对手”。这样就能既不慌,也能足够重视。
说了那么多废话,话归正传。项目里我想加一个自动配置log4j的日志文件的功能,为每一个新进的任务分配一个自己的文件夹。这就免不了要修改log4j.xml文件了。一开始是用DOM做的,复杂又麻烦,推荐使用dom4j,封装的比较好。
接触新东西先要知道它是什么?那就百度一下到底什么是xml。百度是这么说的
可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
读了三遍,不知道它在说什么,还是不知道什么是xml,太官方了好吗。直到读到了W3C的解释,我才在脑袋里有了一点概念,W3C是这么说的
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
html是标记语言,xml是可扩展的标记语言,这样看上去他们还是有关系的,不过xml多了一个可扩展的能力,也就是说xml的标签是我们可以扩展的,不像html标签是写死的<a></a>这么写就是链接,<p></p>这就是段落。从名字上看是这样的。但是他们还有一个巨大的差别(敲黑板!!)html是用来展示数据的,而xml是用来传输数据的一种数据格式,这个格式是W3C制定的。我们可以根据这个格式放数据,拿数据。
这样看就很简单了,这就像我们自己开了一个记事本,像这样记录了一个人的信息
姓名:孙悟空
性别:男
年龄:501
职业:花果山扛把子
我们规定姓名(冒号)后面跟的是一个人的名字,性别(冒号)后面跟的是一个人是男是女的信息等等。。
这里的姓名(冒号)不就是标记吗?标记着后面的是人的名字信息。这样看是能另人接受的,那如果写的奇怪一点呢?像这样
<root>
<name>孙悟空</name>
<sex>男</sex>
<age>501</age>
<job>花果山扛把子</job>
</root>
<name></name>现在就等同于“姓名:”以此类推,这样也可以记录下来一个人的信息,我们一眼就能读出来这段文本的意思是“有一个男的,501岁,叫孙悟空,是花果山的扛把子”。
但是问题又来了,你现在听我说这么久,你能读懂这个意思。那要是不知道还有这种操作的人,他来了对着这段文本肯定一脸懵逼啊!这个怎么解决?不用你解决,也不用我解决。W3C站出来了,他们本来就是制定标准的人,他们就制定了一套这样存放数据的标准,取名叫xml。
现在你知道什么是xml了吧,也知道怎么读写了,但是,但是,你会了有什么用?你念给计算机听吗?所以计算机怎么读写呢?我们今天就用dom4j包装的方法,看看xml的读写有多难?
还用上面的例子,我们先读。我们就读一下,这个人到底是谁,读他的姓名。
public class MyXmlDemo {
public static void main(String[] args) throws DocumentException {
String xmlPath = MyXmlDemo.class.getResource("/MyXml.xml").getPath();
// 获得document
SAXReader sr = new SAXReader();
Document document = sr.read(xmlPath);
//获得根元素
Element root = document.getRootElement();
//获得姓名元素
Element name=root.element("name");
//打印姓名
System.out.println(name.getText());
}
}
每一步的代码看注释,简单吗?太简单了好吗?一鼓作气,把他们都读出来。
public class MyXmlDemo {
public static void main(String[] args) throws DocumentException {
String xmlPath = MyXmlDemo.class.getResource("/MyXml.xml").getPath();
// 获得document
SAXReader sr = new SAXReader();
Document document = sr.read(xmlPath);
//获得根元素
Element root = document.getRootElement();
//获得姓名元素
Element name=root.element("name");
//获得年龄元素
Element age=root.element("age");
//获得性别元素
Element sex=root.element("sex");
//获得工作元素
Element job=root.element("job");
//打印信息
System.out.println("有一个"+sex.getText()
+"的,他"+age.getText()
+"岁,他叫"+name.getText()
+"是"+job.getText());
}
}
打印结果:
到了这里,你还感觉xml的读取难吗?掌握了就不难,继续往下看,光读不行,配合写才能解决大部分的问题。还是上面的代码,我要再加一个人进去,就加猪八戒吧。看代码。
public class MyXmlDemo {
public static void main(String[] args){
String xmlPath = "E:/eclipse_work_space/log4j-demo/src/MyXml.xml";
XMLWriter writer=null;
try {
// 获得document
SAXReader sr = new SAXReader();
Document document = sr.read(xmlPath);
//获得根元素
Element root = document.getRootElement();
//添加一个人
Element zhubajie=root.addElement("man");
//为猪八戒添加信息
Element zhuName=zhubajie.addElement("name");
zhuName.setText("猪八戒");
Element zhuSex=zhubajie.addElement("sex");
zhuSex.setText("男");
Element zhuAge=zhubajie.addElement("age");
zhuAge.setText("502");
Element zhuJob=zhubajie.addElement("job");
zhuJob.setText("天蓬元帅");
// 将修改后的xml,写回文件
OutputFormat outputFormat = new OutputFormat();
outputFormat.setEncoding("GB2312");
writer = new XMLWriter(new FileWriter(xmlPath), outputFormat);
writer.write(document);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
改动了一点刚才的存储结构,刚才随手一写,忘了每个人都是一个个体,一个跟别人区别一下啊,有道理吧。这就是可扩展,爱怎么写就怎么写,只要遵循W3C就行了。改过后的是这样。给孙悟空套上了一个<man>标签而已。这样就可以将每个人的信息区分开来。
<root>
<man>
<name>孙悟空</name>
<sex>男</sex>
<age>501</age>
<job>花果山扛把子</job>
</man>
</root>
看着写入的代码比单纯的读文件长了很多,是不是有点怕了,别怕,就是长点而已,其实也是很简单,听我慢慢道来:
写文件最主要的方法:
root.addElement("man");
每个元素可以调用addElement(String 元素名字)方法,返回值是一个你写的元素名字的元素。好拗口,举个例子还是上面的代码。
Element zhubajie=root.addElement("man");
这一行代码执行完之后,你就相当于创造了一个“man”元素,并且将他添加在了root元素里面。返回值就是刚刚你创建的元素,我给他取名就是猪八戒,然后再用他调用addElement(String 元素名字)方法,分别创建了猪八戒的姓名,性别等元素。再调用方法为给个元素设置值,就是这么简单。
但是,到现在为止,你只是在修改“临时的”xml文件,并没有将他写回MyXml.xml文件,所以下面这段代码出马了,他将修改后的xml写回原来的文件。
// 将修改后的xml,写回文件
OutputFormat outputFormat = new OutputFormat();
outputFormat.setEncoding("GB2312");
writer = new XMLWriter(new FileWriter(xmlPath), outputFormat);
writer.write(document);
最后别忘了将资源关上,就像Java的输出流一样,你不关闭流,内容是不会被写进去的。所以在finally中,将资源关闭,这也是一个好习惯,这是什么好习惯??节约资源啊,跟节约水资源一个道理。看运行结果:
<root>
<man>
<name>孙悟空</name>
<sex>男</sex>
<age>501</age>
<job>花果山扛把子</job>
</man>
<man><name>猪八戒</name><sex>男</sex><age>502</age><job>天蓬元帅</job></man></root>
虽然丑,但是还是添加进去了。这只是基础的对xml的操作。大表哥html语言每个元素有属性,小表弟xml当然也有自己的属性,像html 标签的name,id,class属性一样。而且也是可以扩展的,所以我们也可以这样写了。
<root>
<man name="孙悟空" sex="男" age="501">
<描述>孙悟空是中国著名的神话人物之一,
出自四大名著之《西游记》。祖籍东胜神州,
由开天辟地以来的仙石孕育而生,因带领群猴
进入水帘洞而成为众猴之王,尊为 “美猴王”。
后经千山万水拜须菩提祖师为师学艺,得名孙悟空,
学会地煞数七十二变、筋斗云、长生不老等高超的法术。</描述>
</man>
</root>
至于读写都跟刚才差不多,只是多了一对属性的读写方法。addAttribute,attribute。
相信看到这里,你已经不知不觉的认识了xml,知道怎么玩弄他与鼓掌之中。剩下的可能只是具体的方法不熟悉。上面的代码都是运行过的,尽管拿去跑一个demo,相信你很快就能掌握了。