Java如何基于DOM解析xml文件
一、Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath
此文针对其中的DOM方法具体展开介绍及代码分析
sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。如果是嵌入式的情况下建议使用sax方法进行解析,因为它不需要一下子把数据都保存到内存中然后再解析是可以逐步解析的。而DOM不行,必须一次性把数据存到内存中,然后一并解析。这样做虽然速度会很快,但是同时也加大了对内存的消耗。如果文件很大的情况下不建议DOM解析。
二、【DOM简单使用介绍】
1、【DOM(DocumentObjectModel)】
由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。
下面一段是DOM解析xml的一个案例一起来看一下。
【xml原文件】
Tom_zhang1 19 男 18677435526 1 Technicaldepartment Susy_wang 18 女 18962459987 2 Financialdepartment Jack_Ma 45 男 1867755334 3 Financialdepartment
【代码】
Staff类
packageEntity;
publicclassStaff{
privateintid;
privateStringname;
privateintage;
privateStringsex;
privateStringphone;
privateStuGroupgroup;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
publicStringgetPhone(){
returnphone;
}
publicvoidsetPhone(Stringphone){
this.phone=phone;
}
publicStuGroupgetGroup(){
returngroup;
}
publicvoidsetGroup(StuGroupgroup){
this.group=group;
}
publicStaff(){
super();
//TODOAuto-generatedconstructorstub
}
publicStaff(intid,Stringname,intage,Stringsex,Stringphone,
StuGroupgroup){
super();
this.id=id;
this.name=name;
this.age=age;
this.sex=sex;
this.phone=phone;
this.group=group;
}
@Override
publicStringtoString(){
return"Staff[age="+age+",group="+group+",id="+id
+",name="+name+",phone="+phone+",sex="+sex+"]";
}
}
Group类
packageEntity;
publicclassGroup{
privateintid;
privateStringname;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicGroup(){
super();
//TODOAuto-generatedconstructorstub
}
publicGroup(intid,Stringname){
super();
this.id=id;
this.name=name;
}
@Override
publicStringtoString(){
return"Group[id="+id+",name="+name+"]";
}
}
注释:Staff类不需解释,xml文件中有几个<>就需要创建几个字段。Group类的创建是因为group本身又是一个节点,它有它自己的字段。因此在这边把这种情况单独作为一个类创建,同时也方便日后维护管理。依次类推如果有更多的子类,方法一样创建相应的类即可。
无论是DOM解析还是SAX解析,都是通过一个叫做Parser的解释器,来对xml文件进行解析。而这个解析器是需要我们手动创建的,接下来就一起来看一下解释器中的代码,也是最主要的代码。
Dom_parser(解析器)
packageParser;
importjava.io.File;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
importEntity.StuGroup;
importEntity.Staff;
publicclassDom_parser{
publicstaticListparser(StringfileName){
Liststaffs=newArrayList();//创建一个ArrayList来装数据
DocumentBuilderFactoryfactory=null;//DocumentBuilderFactory,DocumentBuilder,Document分别是DOM解析的工厂类
DocumentBuilderbuilder=null;
Documentdoc=null;
Staffstaff=null;//方便日后实例化
StuGroupgroup=null;//同上
try{
factory=DocumentBuilderFactory.newInstance();//工厂类实例化
builder=factory.newDocumentBuilder();//工厂类实例化
doc=builder.parse(newFile(fileName));//通过.parser方法加载文件
Elementroot=doc.getDocumentElement();//Element方法中的.getDocumentElement()代表获取xml文件的头文件内容
NodeListnodelist=root.getElementsByTagName("staff");//获取TagName,每一个<>中的字段为一个TagName.作为一个nodelist来保存
//循环这个NodeList,然后得到每个nodelist中的item。根据获取到的值的索引最终通过.set方法得到这个值
for(intindex=0;index中的TagName
//同上循环子childNode这个list,获取到每个元素的下标。再通过.set方法分别得到每个元素的值。
for(inti=0;i
【测试类】
packageParser;
importjava.util.List;
importEntity.Staff;
publicclassTest{
publicstaticvoidmain(String[]args){
Stringfile="C:/Users/IBM_ADMIN/Desktop/xml/staff.xml";//指定文件地址
Liststaffs=Dom_parser.parser(file);//因为我们创建的解析器的名字叫Dom_parser所以在这里调用Dom_parser.parser()方法。()中参数为文件地址。//循环并打印结果
for(Stafflist:staffs){
System.out.println(list);
}
}
}
【打印结果】
打印结果如下。可以看到xml中每个TageName以及对应的值,通过DOM解析的方式把结果都一一的被获取并打印出来了。
目前我们是把数据放到了ArrayList内存中。后续可以把数据存放到数据库中。
Staff[age=19,group=Group[id=1,name=Technicaldepartment],id=1,name=Tom_zhang1,phone=18677435526,sex=男]
Staff[age=18,group=Group[id=2,name=Financialdepartment],id=2,name=Susy_wang,phone=18962459987,sex=女]
Staff[age=45,group=Group[id=3,name=Financialdepartment],id=3,name=Jack_Ma,phone=1867755334,sex=男]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。