查看本章节

查看作业目录


需求说明:

使用 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. 实时数据同步inotify+rsync

    inotify inotify是一个实时监控服务,他能实时监控服务器中的目录的变化,发现目录中变化后,在配合rsync服务推送到备份服务器上 inotify要求内核要在2.6.13或之上,通过noti ...

  2. Vector Bin Packing 华为讲座笔记

    Vector bin packing:first fit / best fit / grasp 成本:性价比 (先验) 设计评价函数: evaluation function:cosine simil ...

  3. 【Matlab】向图像域添加噪声/高斯/均匀/伽马/指数/椒盐

    [向图像域添加噪声] matlab自带一个函数:imnoise,可以对图像添加噪声. Matlab的说明 https://www.mathworks.com/help/images/ref/imnoi ...

  4. 【Xcode】sh: pause: command not found

    system("pause"); 只适合于DOS和Windows系统,不适合Linux系统. 直接删掉就可以. 或者改为: #include <unistd.h> pa ...

  5. shell脚本 用户登录服务器发送钉钉提醒

    一.企业微信配置 1.获取AgentId(AppID).Secret .CropID.部门ID 创建一个企业微信应用获取到AgentId(AppID).Secret 2.获取CropID,点击 &qu ...

  6. 每一个each(Power Query 之 M 语言)

    each _ 固定结构,表示每一个(废话,each这单词中文意思就是每一个) 但后面的下划线,是个省略参数的写法-- 首先,each后面不是非要跟_ 其次,_代表的意思是指定列里同行的每一个,这时的公 ...

  7. CF792A New Bus Route 题解

    Content 给定一个长度为 \(n\) 的数列 \(a_1,a_2,a_3,...,a_n\),求这个序列当中差的绝对值最小的数对并求出这样的数对的个数. 数据范围:\(2\leqslant n\ ...

  8. java IO操作和计算操作:工作内存和主内存 volatile关键字作用;原子操作对象AtomicInteger ....

    应该停止但无法停止的计算线程 如下线程示例,线程实例中while循环中的条件,在主线程中通过调用实例方法更新后,while循环并没有更新判断变量是否还成立.而是陷入了while(true)死循环. i ...

  9. java面向对象类的继承~ 匿名类 ;多态特性;强制类型转换

    类的继承 创建子类语法:     修饰符 class 子类名 extends 父类名{        } 匿名子类语法: 直接实例化,过程中通过匿名类 继承父类,在实例化过程中将子类匿名 <父类 ...

  10. ss命令用来显示处于活动状态的套接字信息。

    ss命令用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比net ...