使⽤Dom4j解析xml模板步骤
⼀、解析xml⽂件的⽅法
xml⽂件说⽩了就是⼀个有规则的记事本⽂件(万物皆可⽂本),它⾥⾯有成对的标签,通常我们解析⼀个记事本时,就是直接读取,其实针对xml也可以直接读取,但是太⿇烦了,为啥不针对它⾃⾝的⼀些性质,再集成⼀些处理⽅法呢,所以我们前⼈就创造了好多技术。
⼤概有两种思路,⼀是基于树结构处理的Dom解析,另外⼀种是基于事件模型的SAX解析。树结构Dom解析我理解就是,“不管你解不解析,我都要把整篇按层次加载好”;事件模型就是“你提出问题,我根据你的问题从头去答案,到就停⽌”。显然,这两个思路的优缺点⼀⽬了然。下⾯就这两个思路讲⼏种⽅法:
1. DOM(Document Object Model)
DOM是⽤与平台和语⾔⽆关的⽅式表⽰XML⽂档的官⽅W3C标准。DOM是以层次结构组织的节点或信息⽚断的集合。这个层次结构允许开发⼈员在树中寻特定信息。分析该结构通常需要加载整个⽂档和构造层次结构,然后才能做任何⼯作。
优点
使用dom4j解析xml文件
①允许应⽤程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
缺点
①通常需要加载整个XML⽂档来构造层次结构,消耗资源⼤。
2. SAX(Simple API for XML)
SAX处理的优点⾮常类似于流媒体的优点。分析能够⽴即开始,⽽不是等待所有的数据被处理。⽽且,由于应⽤程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于⼤型⽂档来说是个巨⼤的优点。事实上,应⽤程序甚⾄不必解析整个⽂档;它可以在某个条件得到满⾜时停⽌解析。⼀般来说,SAX还⽐它的替代者DOM快许多。
DOM解析器把XML⽂档转化为⼀个包含其内容的树,并可以对树进⾏遍历。⽤DOM解析模型的优点是编程容易,开发⼈员只需要调⽤建树的指令,然后利⽤navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然⽽由于使⽤DOM解析器的时候需要处理整个XML⽂档,所以对性能和内存的要求⽐较⾼,尤其是遇到很⼤的XML⽂件的时候。由于它的遍历能⼒,DOM解析器常⽤于XML⽂档需要频繁的改变的服务中。
SAX解析器采⽤了基于事件的模型,它在解析XML⽂档的时候可以触发⼀系列的事件,当发现给定的tag的时候,它可以激活⼀个回调⽅法,告诉该⽅法制定的标签已经到。SAX对内存的要求通常会⽐较低,因为它让开发⼈员⾃⼰来决定所要处理的tag.特别是当开发⼈员只需要处理⽂档中所包含的部分数据时,SAX这种扩展能⼒得到了更好的体现。但⽤SAX解析器的时候编码⼯作会⽐较困难,⽽且很难同时访问同⼀个⽂档中的多处不同数据。
优势
①不需要等待所有数据都被处理,分析就能⽴即开始。
②只在读取数据时检查数据,不需要保存在内存中。
③可以在某个条件得到满⾜时停⽌解析,不必解析整个⽂档。
④效率和性能较⾼,能解析⼤于系统内存的⽂档。
缺点
①需要应⽤程序⾃⼰负责TAG的处理逻辑(例如维护⽗/⼦关系等),⽂档越复杂程序就越复杂。
②单向导航,⽆法定位⽂档层次,很难同时访问同⼀⽂档的不同部分数据,不⽀持XPath。
3. JDOM(Java-based Document Object Model)
JDOM的⽬的是成为Java特定⽂档模型,它简化与XML的交互并且⽐使⽤DOM实现更快。由于是第⼀个Java特定模型,JDOM⼀直得到⼤⼒推⼴和促进。正在考虑通过“Java规范请求JSR-102”将它最终⽤作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
JDOM与DOM主要有两⽅⾯不同。⾸先,JDOM仅使⽤具体类⽽不使⽤接⼝。这在某些⽅⾯简化了API,但是也限制了灵活性。第⼆,API⼤量使⽤了Collections类,简化了那些已经熟悉这些类的Java开发者的使⽤。
JDOM⽂档声明其⽬的是“使⽤20%(或更少)的精⼒解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于⼤多数Java/XML应⽤程序来说当然是有⽤的,并且⼤多数开发者发现API⽐DOM容易理解得多。JDOM还包括对程序⾏为的相当⼴泛检查以防⽌⽤户做任何在XML中⽆意义的事。然⽽,它仍需要您充分理解XML以便做⼀些超出基本的⼯作(或者甚⾄理解某些情况下的错误)。这也许是⽐学习DOM或JDOM接⼝都更有意义的⼯作。
JDOM⾃⾝不包含解析器。它通常使⽤SAX2解析器来解析和验证输⼊XML⽂档(尽管它还可以将以前构造的DOM表⽰作为输⼊)。它包含⼀些转换器以将JDOM表⽰输出成SAX2事件流、DOM模型或XML⽂本⽂档。JDOM是在Apache许可证变体下发布的开放源码。
优点
①使⽤具体类⽽不是接⼝,简化了DOM的API。
②⼤量使⽤了Java集合类,⽅便了Java开发⼈员。
缺点
①没有较好的灵活性。
②性能较差。
4. DOM4J(Document Object Model for Java)
虽然DOM4J代表了完全独⽴的开发结果,但最初,它是JDOM的⼀种智能分⽀。它合并了许多超出基本XML⽂档表⽰的功能,包括集成的XPath⽀持、XML Schema⽀持以及⽤于⼤⽂档或流化⽂档的基于事件的处理。它还提供了构建⽂档表⽰的选项,它通过DOM4J API 和标准DOM接⼝具有并⾏访问功能。从2000下半年开始,它就⼀直处于开发之中。
为⽀持所有这些功能,DOM4J使⽤接⼝和抽象基本类⽅法。DOM4J⼤量使⽤了API中的Collections
类,但是在许多情况下,它还提供⼀些替代⽅法以允许更好的性能或更直接的编码⽅法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了⽐JDOM⼤得多的灵活性。
在添加灵活性、XPath集成和对⼤⽂档处理的⽬标时,DOM4J的⽬标与JDOM是⼀样的:针对Java开发者的易⽤性和直观操作。它还致⼒于成为⽐JDOM更完整的解决⽅案,实现在本质上处理所有Java/XML问题的⽬标。在完成该⽬标时,它⽐JDOM更少强调防⽌不正确的应⽤程序⾏为。
DOM4J是⼀个⾮常⾮常优秀的Java XML API,具有性能优异、功能强⼤和极端易⽤使⽤的特点,同时它也是⼀个开放源代码的软件。如今你可以看到越来越多的Java软件都在使⽤DOM4J来读写XML,特别值得⼀提的是连Sun的JAXM也在⽤DOM4J.
【优点】
①⼤量使⽤了Java集合类,⽅便Java开发⼈员,同时提供⼀些提⾼性能的替代⽅法。
②⽀持XPath。
③有很好的性能。
【缺点】
①⼤量使⽤了接⼝,API较为复杂。
**总结:**以上四种⽅法,从程序员的⾓度来说,其实就是从繁到简。解决⼀个问题,⼀般最⼀开始⽅法很粗暴,只要解决问题就⾏了,后来⼜发现这个⽅法有些复杂,就进⾏优化;或者从另⼀个⾓度,有更加简单的⽅法,这就出来分⽀了。随着技术不断的发展、⼈们的探索,解决问题的⽅法肯定越来越简单,但是,往往距离它的底层也越来越远,那是因为前⼈不断的对⽅法进⾏封装,使它越来越接近⼈们的⼤脑思考⽅式。程序员就是物与⼈交流的桥梁。其实对于⼀般的技术⼈员来说,没必要也不可能对每种技术的底层了解,有时候,往往只要知道如何使⽤它解决你的问题即可,好了,⼜说了⼀堆⼤道理。
所以,⽇常中使⽤的就是dom4j技术了,下⾯写个demo。
⼆、使⽤Dom4j解析xml
需要下载dom4j.jar包
基本步骤:
1. 创建SAXReader,⽤来读取XML⽂件2⽂件
2. 指定xml⽂件使得SAXReader读取,并解析成⽂档对象Document
3. 获取根元素对象(Element)
4. 通过Element的⼀些⽅法,获取标签名、标签属性、标签内容。
“⼀般使⽤迭代器或者for循环进⾏层层遍历”
要解析的xml⽂件:l
<?xml version="1.0" encoding="UTF-8"?>
<companys name="com">
<company1 id="1001">
<name>万科A</name>
<address>⼴东深圳</address>
</company1>
<company2 id="1002">
<name>恒⼤B</name>
<address>⼴东⼴州</address>
</company2>
<company3 id="1003">
<name>⾦地C</name>
<address>北京</address>
</company3>
<company4 id="1006">
<name>绿地D</name>
<address>上海</address>
</company4>
</companys>
解析l的java代码:
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class AnalysisDemo {
public static void main(String args[]){
try{
// 创建SAXReader对象来读取xml
SAXReader reader =new SAXReader();
File xmlFile =new File("E:\\l");
Document doc = ad(xmlFile);
// 得到根标签
Element root = RootElement();
// 使⽤迭代⽅法遍历当前元素的⼦元素,创建⼦元素迭代器。当
Iterator<Element> it = root.elementIterator(/*⾥⾯也可以设置字符串,迭代特定名称的元素*/);
while(it.hasNext()){
Element em = it.next();
System.out.println("标签名:"+em.getName()+";标签的内容:"+em.getText());
}
/
/ 迭代遍历当前标签对象的属性
for(Iterator<Attribute> itt = root.attributeIterator(); itt.hasNext();){
Attribute ab = ();
System.out.println("属性名:"+ab.getName()+";属性值:"+ab.getStringValue());
}
// 上⾯是使⽤迭代器遍历,其实也可以使⽤for循环遍历,
// Element对象调⽤elements()⽅法可以返回⼦元素集合
}catch(Exception e){
e.printStackTrace();
}
}
}
使⽤基本的dom4j可以实现xml的解析,但是⽐较⿇烦,它⼀开始是从根节点开始⼀层⼀层的递进深⼊。下⾯介绍基于dom4j的Xpath,他可以直接定位到你想到的位置。
需要导⼊javen.jar,还有它所依赖的jar包。
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class AnalysisDemo {
public static void main(String args[]){
try{
// 创建SAXReader对象来读取xml
SAXReader reader =new SAXReader();
File xmlFile =new File("E:\\l");
Document doc = ad(xmlFile);
// 得到根标签
Element root = RootElement();
Node node1 = root.selectSingleNode("./company1");
System.out.println("id属性的属性值:"+node1.valueOf("@id"));
Node node2 = root.selectSingleNode("./company1/name");
System.out.println("标签名:"+Name()+";标签内容:"+Text());
}catch(Exception e){
e.printStackTrace();
}
}
}
Xpath的优点是可以迅速定位到⼀个位置,不像之前那个,得⼀层⼀层遍历。还有⼀个就是,这⾥有个Node类,我刚开始⽤的时候有点迷糊,如何使⽤Element和Node呢?可以看下⾯此⽂章:
差不多吧,处理xml⽆⾮就是取标签名、标签属性、标签属性值、标签内容这些。模式⽅法其实很固定,使⽤时还是Xpath简单些。下⾯稍微看下如何写⼀个xml⽂件。
三、写⼊xml⽂件
基本步骤:
1. ⾸先建⽴⼀个Document对象
2. 使⽤Document创建⼀个根节点对象(Element)
3. 调⽤addElement(String em)添加⼦元素并返回这个Element,谁调⽤就在谁的下⾯创建标签;调⽤a
ddText(String content)添加
标签内容;调⽤addAttribute(String name,String value)添加属性和属性值,⼀层⼀层逐个添加。
“如果标签⾥⾯没有内容,⾃动闭合,就是单独的标签”
代码⽰例:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论