查看本章节

查看作业目录


需求说明:

使用 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. Default Constructors

    A constructor without any arguments or with default value for every argument, is said to be default ...

  2. Static data members in C++

    Predict the output of following C++ program: 1 #include <iostream> 2 using namespace std; 3 4 ...

  3. java 动态代理—— Mybaties 拦截器链基本原理实现

    1.摘要 Mybaties 中有个分页插件,之前有特意的去了解了一下原理 :https://www.cnblogs.com/jonrain0625/p/11168247.html,从了解中得知分页插件 ...

  4. java通过JDBC访问数据库(最基本的查询)

    一.步骤介绍 1.通过Class.forName()加载驱动: 2.通过DriverManager.getConnection()获取Conncetion连接对象: 3.创建Statement对象传递 ...

  5. 使用JSP实现输出

    一.在JSP页面添加java代码,实现输出,java代码写在<% %>中. 代码示例1: <body> <!-- HTML注释 --> <%-- JSP注释 ...

  6. redis迁移工具redis-migrate-tool

    目录 一.简介 二.测试 三.安装 四.验证 一.简介 redis-migrate-tool是在redis之间迁移数据的一个方便且有用的工具.他会已服务方式不断同步两边的数据.等到合适时间,中断red ...

  7. Jenkins 报错合集

    目录 一.启动项目显示,没有接受许可之前不能够自动安装 二.明明配置了jdk但还是说找不到 三.jenkins-RestAPI调用出现Error 403 No valid crumb was incl ...

  8. 《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)

    1.简介 面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了 ...

  9. JS如何区分微信浏览器、QQ浏览器和QQ内置浏览器,解决 ios 无法判断是否为qq浏览器环境的问题 !!!

    原理 通过不同移动端的ua弹窗 获取user-agent 参数包含的信息,进行判断浏览器类型 在Android上 QQ内置环境的ua中有关键字 MQQBrowser, 并且后面包含一个[空白符+QQ] ...

  10. Table.Distinct取唯/众数….Distinct/Mode/判断…IsDistinct(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...