电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java如何基于DOM解析xml文件

瀏覽:3日期:2022-08-24 15:03:54

一、Java解析xml、解析xml四種方法、DOM、SAX、JDOM、DOM4j、XPath

此文針對(duì)其中的DOM方法具體展開介紹及代碼分析

sax、dom是兩種對(duì)xml文檔進(jìn)行解析的方法(沒有具體實(shí)現(xiàn),只是接口),所以只有它們是無(wú)法解析xml文檔的;jaxp只是api,它進(jìn)一步封裝了sax、dom兩種接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默認(rèn)使用xerces解釋器)。如果是嵌入式的情況下建議使用sax方法進(jìn)行解析,因?yàn)樗恍枰幌伦影褦?shù)據(jù)都保存到內(nèi)存中然后再解析是可以逐步解析的。而DOM不行,必須一次性把數(shù)據(jù)存到內(nèi)存中,然后一并解析。這樣做雖然速度會(huì)很快,但是同時(shí)也加大了對(duì)內(nèi)存的消耗。如果文件很大的情況下不建議DOM解析。

二、【DOM 簡(jiǎn)單使用介紹】

1、【DOM(Document Object Model) 】

由W3C提供的接口,它將整個(gè)XML文檔讀入內(nèi)存,構(gòu)建一個(gè)DOM樹來(lái)對(duì)各個(gè)節(jié)點(diǎn)(Node)進(jìn)行操作。

下面一段是DOM解析xml的一個(gè)案例一起來(lái)看一下。

【xml原文件】

<?xml version = '1.0' encoding = 'UTF-8'?><staffs> <staff id='1'> <name>Tom_zhang1</name> <age>19</age> <sex>男</sex> <phone>18677435526</phone> <group> <id>1</id> <name>Technical department</name> </group> </staff> <staff id='2'> <name>Susy_wang</name> <age>18</age> <sex>女</sex> <phone>18962459987</phone> <group> <id>2</id> <name>Financial department</name> </group> </staff> <staff id='3'> <name>Jack_Ma</name> <age>45</age> <sex>男</sex> <phone>1867755334</phone> <group> <id>3</id> <name>Financial department</name> </group> </staff></staffs>

【代碼】

Staff 類

package Entity;public class Staff { private int id; private String name; private int age; private String sex; private String phone; private StuGroup group; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public StuGroup getGroup() { return group; } public void setGroup(StuGroup group) { this.group = group; } public Staff() { super(); // TODO Auto-generated constructor stub } public Staff(int id, String name, int age, String sex, String phone, StuGroup group) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.phone = phone; this.group = group; } @Override public String toString() { return 'Staff [age=' + age + ', group=' + group + ', id=' + id+ ', name=' + name + ', phone=' + phone + ', sex=' + sex + ']'; }}

Group 類

package Entity;public class Group { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Group() { super(); // TODO Auto-generated constructor stub } public Group(int id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return 'Group [id=' + id + ', name=' + name + ']'; } }

注釋: Staff類不需解釋,xml文件中有幾個(gè)<>就需要?jiǎng)?chuàng)建幾個(gè)字段。Group類的創(chuàng)建是因?yàn)間roup本身又是一個(gè)節(jié)點(diǎn),它有它自己的字段。因此在這邊把這種情況單獨(dú)作為一個(gè)類創(chuàng)建,同時(shí)也方便日后維護(hù)管理。依次類推如果有更多的子類,方法一樣創(chuàng)建相應(yīng)的類即可。

無(wú)論是DOM解析還是SAX解析,都是通過(guò)一個(gè)叫做Parser的解釋器,來(lái)對(duì)xml文件進(jìn)行解析。而這個(gè)解析器是需要我們手動(dòng)創(chuàng)建的,接下來(lái)就一起來(lái)看一下解釋器中的代碼,也是最主要的代碼。

Dom_parser(解析器)

package Parser;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import Entity.StuGroup;import Entity.Staff;public class Dom_parser { public static List<Staff> parser(String fileName) { List<Staff> staffs = new ArrayList<Staff>(); //創(chuàng)建一個(gè)ArrayList來(lái)裝數(shù)據(jù) DocumentBuilderFactory factory = null; //DocumentBuilderFactory,DocumentBuilder,Document分別是DOM解析的工廠類 DocumentBuilder builder = null; Document doc = null; Staff staff = null; //方便日后實(shí)例化 StuGroup group = null; //同上 try { factory = DocumentBuilderFactory.newInstance(); //工廠類實(shí)例化 builder = factory.newDocumentBuilder(); //工廠類實(shí)例化 doc = builder.parse(new File(fileName)); //通過(guò).parser方法加載文件 Element root = doc.getDocumentElement(); //Element方法中的.getDocumentElement()代表獲取xml文件的頭文件內(nèi)容 NodeList nodelist = root.getElementsByTagName('staff'); //獲取TagName,每一個(gè)<>中的字段為一個(gè)TagName.作為一個(gè)nodelist來(lái)保存 //循環(huán)這個(gè)NodeList,然后得到每個(gè)nodelist中的item。根據(jù)獲取到的值的索引最終通過(guò).set方法得到這個(gè)值 for (int index = 0; index < nodelist.getLength(); index++) {staff = new Staff();Node node = nodelist.item(index);staff.setId(Integer.parseInt(node.getAttributes().getNamedItem( 'id').getTextContent()));// System.out.println(staff);NodeList childNode = node.getChildNodes(); //設(shè)置一個(gè)childNode為了存放nodelist下子<>中的TagName//同上循環(huán)子childNode這個(gè)list,獲取到每個(gè)元素的下標(biāo)。再通過(guò).set方法分別得到每個(gè)元素的值。for (int i = 0; i < childNode.getLength(); i++) { Node childitem = childNode.item(i); if (childitem.getNodeName().equals('name')) { staff.setName(childitem.getTextContent()); } else if (childitem.getNodeName().equals('age')) { staff.setAge(Integer.parseInt(childitem.getTextContent())); } else if (childitem.getNodeName().equals('sex')) { staff.setSex(childitem.getTextContent()); } else if (childitem.getNodeName().equals('phone')) { staff.setPhone(childitem.getTextContent()); } else if (childitem.getNodeName().equals('group')) { NodeList groupnode = childitem.getChildNodes(); for (int j = 0; j < groupnode.getLength(); j++) { Node groupitem = groupnode.item(j); if (groupitem.getNodeName().equals('id')) {group = new StuGroup(); //這里的實(shí)例化很重要,切記不要實(shí)例化錯(cuò)誤地方String groupId = groupitem.getTextContent();group.setId(Integer.parseInt(groupId));staff.setGroup(group); } else if (groupitem.getNodeName().equals('name')) {String groupName = groupitem.getTextContent();group.setName(groupName);staff.setGroup(group); } } }}staffs.add(staff); //最終我們要把staff這個(gè)對(duì)象追加到staffs這個(gè)集合中。 } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return staffs; //返回這個(gè)集合 }}

【測(cè)試類】

package Parser; import java.util.List; import Entity.Staff; public class Test { public static void main(String[] args) { String file = 'C:/Users/IBM_ADMIN/Desktop/xml/staff.xml'; //指定文件地址 List<Staff> staffs = Dom_parser.parser(file); //因?yàn)槲覀儎?chuàng)建的解析器的名字叫Dom_parser所以在這里調(diào)用Dom_parser.parser()方法。()中參數(shù)為文件地址。//循環(huán)并打印結(jié)果 for(Staff list:staffs){ System.out.println(list); } }}

【打印結(jié)果】

打印結(jié)果如下。可以看到xml中每個(gè)TageName以及對(duì)應(yīng)的值,通過(guò)DOM解析的方式把結(jié)果都一一的被獲取并打印出來(lái)了。

目前我們是把數(shù)據(jù)放到了ArrayList內(nèi)存中。后續(xù)可以把數(shù)據(jù)存放到數(shù)據(jù)庫(kù)中。

Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男]Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! | 太平洋亲子网_健康育儿 品质生活| 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 山东信蓝建设有限公司官网 | 商秀—企业短视频代运营_抖音企业号托管 | 球盟会·(中国)官方网站| 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 日本东丽膜_反渗透膜_RO膜价格_超滤膜_纳滤膜-北京东丽阳光官网 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 27PR跨境电商导航 | 专注外贸跨境电商| 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 深圳市人通智能科技有限公司| 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 茶叶百科网-茶叶知识与茶文化探讨分享平台| 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 |