查看本章节

查看作业目录


需求说明:

使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式如图所示

实现思路:

  1. 创建ParseHeroXML用于解析Xml,创建Hero类用于封装解析的英雄对象数据
  2. 在ParseHeroXML中定义parse()解析方法,根据讲解SAXReader进行解析Xml文件,获取根节点,定义listNodes递归方法调用,传入根节点
  3. 在listNodes方法中,遍历节点信息,分别根据节点名称获取相关节点的属性,遇到hero节点时,代表是一个英雄信息, 创建Hero实体对象,存储至List集合中,然后调用获取子节点信息方法getAttrAndChildNode
  4. getAttrAndChildNode为获取hero子节点下的信息的方法,该方法中,获取属性判断是name或id,存储至Hero对象中,继续遍历子节点递归调用
  5. 循环遍历List集合中的Hero对象信息,输出查看

实现代码:

用于解析Xml的ParseHeroXML

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class ParserHeroXML {
Document document = null;
Element rootElement = null;
Hero hero = null;
// 用来保存所有的英雄数据
List<Hero> heros = new ArrayList<>(); // 解析XML文档
public void parse() {
try {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件,转换成Document对象
document = reader.read(new File("H:/hero.xml"));
// 获取根节点元素对象
rootElement = document.getRootElement();
// 遍历所有的元素节点
listNodes(rootElement);
} catch (DocumentException e) {
e.printStackTrace();
}
} // 递归遍历节点信息
public void listNodes(Element element) {
// 获取节点名称
String elementName = element.getName();
// 获取节点的文本
String elementText = element.getTextTrim();
// 判断当前的节点名称
switch (elementName) {
case "hero":
hero = new Hero();
heros.add(hero);
getAttrAndChildNode(element);
break;
case "gender":
hero.setGender(elementText);
break;
case "profession":
hero.setProfession(elementText);
break;
case "nationality":
hero.setNationality(elementText);
break;
case "price":
hero.setPrice(Double.parseDouble(elementText));
break;
case "heroList":
getAttrAndChildNode(element);
break;
default:
break;
}
} // 获取节点上的属性值和子节点对象
public void getAttrAndChildNode(Element element) {
// 获取节点的所有属性
List<Attribute> attributes = element.attributes();
Attribute attr = null;
String attrValue = null;
// 循环遍历节点的每个属性
for (int i = 0; i < attributes.size(); i++) {
// 获取节点中的每个属性
attr = attributes.get(i);
// 获取每个属性所对应的值
attrValue = attr.getValue();
// 判断是否是id节点还是name节点
if ("id".equals(attr.getName())) {
// 将id的值保存到hero对象内
hero.setId(Integer.parseInt(attrValue));
} else if ("name".equals(attr.getName())) {
// 将name的值保存到hero对象内
hero.setName(attrValue);
}
}
// 获取当前节点下的所有子节点
Iterator<Element> eleIterator = element.elementIterator();
// 判断该节点下是否还有子节点
while (eleIterator.hasNext()) {
// 取出子节点
Element e = eleIterator.next();
// 递归遍历子节点的信息
listNodes(e);
}
} // 遍历保存到集合中的英雄信息
public void showHeroInfo() {
for (Hero tempHero : heros) {
System.out.printf("编号:%d,姓名:%s,性别:%s,职业:%s,国籍:%s,价格:%.2f\n", tempHero.getId(), tempHero.getName(),
tempHero.getGender(), tempHero.getProfession(), tempHero.getNationality(), tempHero.getPrice());
}
} public static void main(String[] args) {
ParserHeroXML parserHeroXML = new ParserHeroXML();
parserHeroXML.parse();
parserHeroXML.showHeroInfo();
}
}

用于封装解析的英雄对象数据Hero

public class Hero {

	private int id;// 英雄编号
private String name;// 英雄名称
private String gender;// 英雄性别
private String profession;// 英雄职业
private String nationality;// 英雄国籍
private double price; // 出售价格 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 String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public String getProfession() {
return profession;
} public void setProfession(String profession) {
this.profession = profession;
} public String getNationality() {
return nationality;
} public void setNationality(String nationality) {
this.nationality = nationality;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
}
}

编写Java程序,使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式的更多相关文章

  1. Java 程序 关于Properties 类使用Store方法时不能会覆盖以前Properties 文件的内容

    F:\\Demo.properties 文件内容: #\u65B0\u589E\u4FE1\u606F#Wed Sep 14 11:16:24 CST 2016province=广东tt=近蛋city ...

  2. 初学编写JAVA程序

    一.编写JAVA程序 编写JAVA程序,输出一行文本信息:“Hello world”,选择编辑器eclipse,打开之后编写程序 public class Hello{ public static v ...

  3. 使用apache daemon让java程序在unix系统上以服务方式运行

    通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行. 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的 ...

  4. Java初学者作业——编写 Java 程序,在控制台中输入日期,计算该日期是对应年份的第几天。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,在控制台中输入日期,计算该日期是对应年份的第几天. 实现思路: (1)声明变量 year.month和 date,用于存储日期中的年.月.日 ...

  5. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  6. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  7. java程序怎么在一个电脑上只启动一次,只开一个进程

    目录 <linux文件锁flock> <NIO文件锁FileLock> <java程序怎么在一个电脑上只启动一次,只开一个进程> 方案1: 单进程程序可以用端口绑定 ...

  8. Java初学者作业——使用记事本编写Java程序

    返回本章节 返回作业目录 需求说明: 使用记事本编写 Java 程序,输出"大家好!我的梦想是做一名 Java 高级工程师!". 为 Java 程序添加单行和多行注释以及文档注释. ...

  9. Java初学者作业——编写Java程序,实现用户登录验证。

    返回本章节 返回作业目录 需求说明: 编写Java程序,实现用户登录验证. 若用户名与密码输入正确,则提示"登录成功,欢迎回来!",若用户名与密码不匹配,则提示"用户名和 ...

随机推荐

  1. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

  2. 颜色RGB值对照表

    转载自 http://www.91dota.com/?p=49# 常用颜色的RGB值及中英文名称   颜  色    RGB值 英文名 中文名   #FFB6C1 LightPink 浅粉红   #F ...

  3. android Paint 详解

    /**     * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体 ...

  4. HongYun项目启动

    一个前后端分离项目的启动顺序: 数据库启动, stams 后台springboot启动 中间路由启动,比如nginx,如果有的话:有这一层,后台可以设置负载均衡,可以动态部署 前端启动

  5. 【Linux】【Shell】【Basic】条件测试

    1. 数值测试:数值比较 -eq:是否等于: [ $num1 -eq $num2 ] -ne:是否不等于: -gt:是否大于: -ge:是否大于等于: -lt:是否小于: -le:是否小于等于: 2. ...

  6. Maven错误收集

    Eclipse 创建项目时报错 Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:1 ...

  7. 1、Linux下安装JDK

    1.Linux下安装JDK 1 权限设置(可忽略) 1.1 安装过程与Windows安装过程相差不多,下载解压安装 1.切换root用户( 如果当前登录的用户权限够的话,请忽略这步) 由于创建目录的位 ...

  8. HashMap的putAll方法介绍说明

    jdk1.8 使用putAll时,新map中的值仅为旧map值所对应对象的引用,并不会产生新对象. 如下,使用for循环赋值! public void putAll(Map<? extends ...

  9. 转: 再谈select, iocp, epoll,kqueue及各种I/O复用机制

    首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal drive ...

  10. MISC常见题型整理

    题目打包在这里 提取码:fhkb MISC 流量包分析 流量包_1 流量包_2 流量包_3 图片隐写 图片隐写_1 图片隐写_2 图片隐写_3 图片隐写_4 图片隐写_5 图片隐写_6 音频隐写 音频 ...