题目:这里有一份XML文件用于储存商品信息,编写一个商品管理系统,可以对XML文件进行增删查改的操作。

<?xml version="1.0" encoding="UTF-8"?>
<GamerInfo><Brand name="索尼"><Type name="PSV" price="2000"/><Type name="PS4" price="3500"/><Type name="PS5" price="4800"/></Brand><Brand name="任天堂"><Type name="Switch" price="2100"/></Brand><Brand name="世嘉"><type name="土星" price="3000"/><type name="海王星" price="Unknown"/></Brand><Brand name="苹果"><type name="菠萝" price="200"/><type name="香蕉" price="180"/></Brand>
</GamerInfo>

一、商品管理系统的功能分析

由题目我们可以知道,增删查改四个功能是需要的功能,此外,我们也要考虑XML文件的读取展示、以及操作后的内容保存功能。

二、商品管理系统的功能实现

(1)读取XML文件内容

1.利用Document类的对象来储存XML文件信息

首先,我们先创建一个GamerBoy类来进行操作。然后,给GamerBoy类一个Document类属性,用来存储获取的XML信息。然后,写一个方法,获取XML文件内容,并存储到Document类的对象中去。

public class GameBoy {//创建Document类的document对象来储存XML信息Document document = null;//用Document类的对象来获取并存储XML文件信息public void getDocument() {//创建SAXReader类的对象来读取XML文件信息SAXReader saxReader = new SAXReader();try {//用SAXReader的read方法,将XML信息储存到document对象中this.document = saxReader.read("src/main/java/JsonPractice/Gamers.xml");} catch (DocumentException e) {e.printStackTrace();}}
}

2.遍历XML文件中的各个节点,将信息打印

第一步,读取Document类的document对象,获取其中的XML信息。第二步,逐级遍历子节点,访问子节点的属性,并输出打印。

public void showInfo() {//获取根节点,并储存到Element类的对象中去Element root = document.getRootElement();//遍历根节点下的Brand子节点Iterator brandIterator = root.elementIterator();while (brandIterator.hasNext()) {//获取当前遍历到的Brand子节点Element brand = (Element) brandIterator.next();//用attributeValue()方法获得指定属性并输出System.out.println(brand.attributeValue("name") + ":");//遍历Brand节点下的Type子节点Iterator typeIterator = brand.elementIterator();while (typeIterator.hasNext()) {//获得当前遍历到的Type子节点Element type = (Element) typeIterator.next();//打印输出信息System.out.println("机型:" + type.attributeValue("name") + "\t价格:" + type.attributeValue("price"));}}}

(2)保存XML信息,输出为XML文件

先创建OutFormat类的对象保存要输出的XML信息,接着创建XMLWriter对象保存输出XML文件的路径和XML信息,最后调用wirte方法输出XML文件。

    //将信息保存至XML文件的方法public void saveXML(String path) {//创建OutputFormat类的对象来储存XML信息OutputFormat format = OutputFormat.createCompactFormat();try {//创建XMLWriter类的对象,来储存输出的XMl文件路径和要输出的XML信息XMLWriter writer = new XMLWriter(new FileWriter(path), format);//调用XMLWriter类的write方法,来输出储存XML信息的文件writer.write(document);writer.close();} catch (IOException e) {e.printStackTrace();}}

(3)删除操作的实现

关于增加输出操作,我在上一篇文章中由详细表述,这里就跳过。如果不清楚,可以通过传送门移步:

Java基础——利用DOM4J来读取、修改、输出XML文件_Alcaibur的博客-CSDN博客

下面进行删除操作的实现:

1.Brand节点的删除

首先是删除品牌的操作,即删除Brand节点。和遍历查询输出类似,只不过在遍历到所需要的Brand节点后,进行删除操作。当然,也要判断一下,Brand节点是否存在的问题。

注意:因为迭代器的操作是多线程的,查改是同时进行的,线程是不安全的。因此,我们操作完数据后,应当及时退出迭代器,这样不仅能保证线程安全,也能保证代码的执行效率。

//删除品牌public void deleteBrand(String brandName) {//获取根节点Element root = document.getRootElement();//遍历根节点下的子节点,即Brand节点Iterator brandIterator = root.elementIterator();boolean tag = false;while (brandIterator.hasNext()) {//获取当前遍历到的Brand节点Element brand = (Element) brandIterator.next();//如果遍历到需要删除的Brand节点,进行删除操作if (brand.attributeValue("name").equals(brandName)) {//因为Brand是根节点的子节点,所以可以通过根节点的remove方法来移除Brand子节点root.remove(brand);tag = true;System.out.println("品牌删除成功!");break;}}if (!tag) {System.out.println("品牌不存在,无法删除!");}}

2.Type节点的删除

Type节点的删除和Brand节点的删除类似,只不过再次遍历Brand节点下的Type子节点进行操作。注意:要记得判断Brand节点是否存在,Brand存在之后,还有判断Type节点是否存在。

    public void deleteGamer(String brandName, String gamerName) {//获得根节点Element root = document.getRootElement();//遍历根节点下的Brand子节点Iterator brandIterator = root.elementIterator();Boolean brandTag = false;Boolean gamerTag = false;while (brandIterator.hasNext()) {//获得当前遍历到的Brand节点Element brand = (Element) brandIterator.next();if (brand.attributeValue("name").equals(brandName)) {//遍历Brand下的Type子节点Iterator typeIterator = brand.elementIterator();while (typeIterator.hasNext()) {Element type = (Element) typeIterator.next();if (type.attributeValue("name").equals(gamerName)) {//首先获取Type的父节点,然后用父节点的remove方法移除子节点Typetype.getParent().remove(type);System.out.println("型号删除成功!");gamerTag = true;break;}}brandTag = true;break;}}if (!brandTag) {System.out.println("品牌不存在,无法删除!");}if (!gamerTag) {System.out.println("型号不存在,无法删除!");}this.saveXML("src/main/java/JsonPractice/Gamers.xml");}

三、商品管理系统交互页面的搭建

这部分相对简单,基础的do-while循环运用和swtich运用。这里直接给出源码内容供各位参考。

    public static void main(String[] args) {//创建gameBoy对象GameBoy gameBoy = new GameBoy();//用gameBoy对象中的document属性来储存XML信息gameBoy.getDocument();Scanner in = new Scanner(System.in);do {System.out.println("——————————————————GameBoy——————————————————");System.out.println("请输入数字选择功能:\n" +"1.查询全部信息\n" +"2.添加品牌\n" +"3.添加机型\n" +"4.删除品牌\n" +"5.删除机型\n" +"6.退出系统");String input = in.next();switch (input) {case "1":System.out.println("查询完毕:");gameBoy.showInfo();continue;case "2":System.out.println("请输入增加的品牌名称:");input = in.next();gameBoy.addBrand(input);continue;case "3":System.out.println("请输入品牌名:");String brandName = in.next();System.out.println("请输入型号:");String typeName = in.next();System.out.println("请设定价格:");String price = in.next();gameBoy.addGamer(brandName, typeName, price);continue;case "4":System.out.println("请输入删除的品牌名称:");input = in.next();gameBoy.deleteBrand(input);continue;case "5":System.out.println("准备删除:");System.out.println("请输入品牌名:");brandName = in.next();System.out.println("请输入型号:");typeName = in.next();gameBoy.deleteGamer(brandName, typeName);continue;case "6":System.exit(0);default:System.out.println("操作码错误!");}} while (true);}

四、代码测试以及结果展示

我进行的操作是,删除苹果品牌、删除世嘉品牌下的海王星、增加微软品牌的XBOX

<?xml version="1.0" encoding="UTF-8"?>
<GamerInfo><Brand name="索尼"><Type name="PSV" price="2000"/><Type name="PS4" price="3500"/><Type name="PS5" price="4800"/></Brand><Brand name="任天堂"><Type name="Switch" price="2100"/></Brand><Brand name="世嘉"><type name="土星" price="3000"/></Brand><Brand name="微软"><type name="XBOX" price="5600"/></Brand>
</GamerInfo>

五、完整代码展示

package JsonPractice;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Scanner;public class GameBoy {//创建Document类的document对象来储存XML信息Document document = null;//用Document类的对象来获取并存储XML文件信息public void getDocument() {//创建SAXReader类的对象来读取XML文件信息SAXReader saxReader = new SAXReader();try {//用SAXReader的read方法,将XML信息储存到document对象中this.document = saxReader.read("src/main/java/JsonPractice/Gamers.xml");} catch (DocumentException e) {e.printStackTrace();}}//将信息保存至XML文件的方法public void saveXML(String path) {//创建OutputFormat类的对象来储存XML信息OutputFormat format = OutputFormat.createCompactFormat();try {//创建XMLWriter类的对象,来储存输出的XMl文件路径和要输出的XML信息XMLWriter writer = new XMLWriter(new FileWriter(path), format);//调用XMLWriter类的write方法,来输出储存XML信息的文件writer.write(document);writer.close();} catch (IOException e) {e.printStackTrace();}}public boolean addBrand(String brandName) {//获取梗目录下的子节点,即Brand节点;并将其存入Element类的对象Element root = document.getRootElement();//存储单个的Brand节点Element brand = null;//判断品牌是否存在boolean tag = false;//遍历所有Brand节点Iterator BrandIterator = root.elementIterator();while (BrandIterator.hasNext()) {//获取每次遍历得到的Brand节点Element brands = (Element) BrandIterator.next();//当遍历到的Brand节点和输入的一致时,说明节点存在不需要创建新的Brand节点if (brands.attributeValue("name").equals(brandName)) {brand = brands;tag = true;System.out.println("品牌已存在,无需创建!");break;}}if (!tag) {brand = root.addElement("Brand");System.out.println("品牌创建成功!");}brand.addAttribute("name", brandName);this.saveXML("src/main/java/JsonPractice/Gamers.xml");return tag;}public void addGamer(String brandName, String typeName, String phonePrice) {//判断是否增加Brand节点this.addBrand(brandName);//获取梗目录下的子节点,即Brand节点;并将其存入Element类的对象Element root = document.getRootElement();//存储单个的Brand节点Element brand = null;//遍历所有Brand节点Iterator BrandIterator = root.elementIterator();while (BrandIterator.hasNext()) {//获取每次遍历得到的Brand节点Element brands = (Element) BrandIterator.next();//找到所需节点if (brands.attributeValue("name").equals(brandName)) {brand = brands;break;}}//遍历Brand下的字节点,即Type节点Iterator types = brand.elementIterator();while (types.hasNext()) {//将获取的Type节点存储到Element类的对象中去Element typeNext = (Element) types.next();//判断是否重复添加if (typeNext.attributeValue("name").equals(typeName)) {System.out.println("机型已存在,无法添加!");return;}}Element type = brand.addElement("type");type.addAttribute("name", typeName);type.addAttribute("price", phonePrice);System.out.println("机型添加成功!");this.saveXML("src/main/java/JsonPractice/Gamers.xml");}//删除品牌public void deleteBrand(String brandName) {//获取根节点Element root = document.getRootElement();//遍历根节点下的子节点,即Brand节点Iterator brandIterator = root.elementIterator();boolean tag = false;while (brandIterator.hasNext()) {//获取当前遍历到的Brand节点Element brand = (Element) brandIterator.next();//如果遍历到需要删除的Brand节点,进行删除操作if (brand.attributeValue("name").equals(brandName)) {//因为Brand是根节点的子节点,所以可以通过根节点的remove方法来移除Brand子节点root.remove(brand);tag = true;System.out.println("品牌删除成功!");break;}}if (!tag) {System.out.println("品牌不存在,无法删除!");}}public void deleteGamer(String brandName, String gamerName) {//获得根节点Element root = document.getRootElement();//遍历根节点下的Brand子节点Iterator brandIterator = root.elementIterator();Boolean brandTag = false;Boolean gamerTag = false;while (brandIterator.hasNext()) {//获得当前遍历到的Brand节点Element brand = (Element) brandIterator.next();if (brand.attributeValue("name").equals(brandName)) {//遍历Brand下的Type子节点Iterator typeIterator = brand.elementIterator();while (typeIterator.hasNext()) {Element type = (Element) typeIterator.next();if (type.attributeValue("name").equals(gamerName)) {//首先获取Type的父节点,然后用父节点的remove方法移除子节点Typetype.getParent().remove(type);System.out.println("型号删除成功!");gamerTag = true;break;}}brandTag = true;break;}}if (!brandTag) {System.out.println("品牌不存在,无法删除!");}if (!gamerTag) {System.out.println("型号不存在,无法删除!");}this.saveXML("src/main/java/JsonPractice/Gamers.xml");}public void showInfo() {Element root = document.getRootElement();Iterator brandIterator = root.elementIterator();while (brandIterator.hasNext()) {Element brand = (Element) brandIterator.next();System.out.println(brand.attributeValue("name") + ":");Iterator typeIterator = brand.elementIterator();while (typeIterator.hasNext()) {Element type = (Element) typeIterator.next();System.out.println("机型:" + type.attributeValue("name") + "\t价格:" + type.attributeValue("price"));}}}public static void main(String[] args) {GameBoy gameBoy = new GameBoy();gameBoy.getDocument();Scanner in = new Scanner(System.in);do {System.out.println("——————————————————GameBoy——————————————————");System.out.println("请输入数字选择功能:\n" +"1.查询全部信息\n" +"2.添加品牌\n" +"3.添加机型\n" +"4.删除品牌\n" +"5.删除机型\n" +"6.退出系统");String input = in.next();switch (input) {case "1":System.out.println("查询完毕:");gameBoy.showInfo();continue;case "2":System.out.println("请输入增加的品牌名称:");input = in.next();gameBoy.addBrand(input);continue;case "3":System.out.println("请输入品牌名:");String brandName = in.next();System.out.println("请输入型号:");String typeName = in.next();System.out.println("请设定价格:");String price = in.next();gameBoy.addGamer(brandName, typeName, price);continue;case "4":System.out.println("请输入删除的品牌名称:");input = in.next();gameBoy.deleteBrand(input);continue;case "5":System.out.println("准备删除:");System.out.println("请输入品牌名:");brandName = in.next();System.out.println("请输入型号:");typeName = in.next();gameBoy.deleteGamer(brandName, typeName);continue;case "6":System.exit(0);default:System.out.println("操作码错误!");}} while (true);}}

Java基础——利用DMO4J编写一个商品管理系统相关推荐

  1. Java基础编程题目——编写一个三角形的类

    编写一个代表三角形的类.其中3条边为三角形的属性,并封装有求三角形的面积和周长的方法.分别针对3条边为3.4.5和7.8.9的两个三角形进行测试. public class Triangle {pub ...

  2. Java基础编程题目——编写一个简单的银行账户类

    创建简单的银行账户类,包括开户人.账号和存款余额三个属性,以及查询余额.存款.取款等方法.创建两个账户验证类的设计. public class Banks {public static void ma ...

  3. 停车场管理系统 java_使用java编写一个停车场管理系统

    使用java编写一个停车场管理系统 发布时间:2020-11-30 16:00:28 来源:亿速云 阅读:145 作者:Leah 这篇文章给大家介绍使用java编写一个停车场管理系统,内容非常详细,感 ...

  4. Java 基础 利用数组来实现银行注册开户、存钱、取钱

    Java 基础 利用数组来实现银行注册开户.存钱.取钱 1.主界面 放置于BankSystem类中 思路: (1)用输入语句完成主界面的编写 (2)用Scanner实现键盘录入数据 (3)用switc ...

  5. java类求圆的面积周长_java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题。编写一个应用程序计算圆的周长和面积,设圆的半...

    问题标题 java编程 1. 设计一个求圆的面积和周长的类,要求:1计算当半径r,JAVA编程题.编写一个应用程序计算圆的周长和面积,设圆的半 2019-5-23来自ip:15.196.194.53的 ...

  6. 利用C#编写一个水准测量近似平差程序

    一.代码界面展示 整个界面主要就是就整个界面而言,其实主要使用到的控件就是Menu,tabControl,dataGridView,richtextbox. 二.代码运算结果展示 1.导入数据 这里就 ...

  7. java语言编程三角形图形_编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用......

    导航:网站首页 > 编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用... 编程题:编写程序输入三角形的3条边长,计算并输出... 求助 ...

  8. c语言编写的商品管理程序,C语言编写的商品管理系统

    C语言编写的商品管理系统 商品的增删改查 #include #include #include #define K 5 int m=2; //商品种数 /*定义商品结构体*/ struct goods ...

  9. 利用android实现汇率计算器,利用python编写一个汇率计算器

    利用python编写一个汇率计算器 发布时间:2020-11-10 15:03:44 来源:亿速云 阅读:137 作者:Leah 这篇文章运用简单易懂的例子给大家介绍利用python编写一个汇率计算器 ...

最新文章

  1. 怎么用leangoo做需求管理?(用户故事地图)
  2. Paket:一个面向.NET的包管理器
  3. junit单元测试断言_简而言之,JUnit:单元测试断言
  4. 安静的飞鸽传书2011绿色版地方
  5. 项目class第十四周项目一:动物学叫
  6. A*B Problem II
  7. mysql 8 配置参数优化_MySQL性能优化之参数配置
  8. python 数据驱动接口自动化框架_用Python实现数据驱动的接口自动化测试
  9. 3.从尾到头打印链表
  10. OEM 13c 监控RAC部署
  11. Linux中缺32位运行库steam,尝试安装Steam错误:您缺少以下32位库,并且Steam可能无法运行:...
  12. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
  13. pytorch 介绍
  14. 【折腾电脑】Edge浏览器看B站视频卡顿最全解决办法合集
  15. unity开发抽奖系统
  16. C语言中extern用法详解
  17. 微信小程序--实现拨打电话功能
  18. JSP标签隐藏以及不可修改
  19. C/C++黑魔法-编译期运行的sizeof
  20. r spgm 语言_R语言 splm包 spml()函数中文帮助文档(中英文对照)

热门文章

  1. OPPO A73s在哪里开启usb调试模式的简单方法
  2. java--JUC快速入门(彻底搞懂JUC)
  3. Java 8 中的List排序
  4. 系统接入小爱开放平台
  5. bodipy荧光标记染料BDP TMR azide/N3/叠氮,BDP修饰叠氮,Ex/Em(nm)545/570
  6. 在计算机启动过程中按F8,Win8如何在启动时按F8出现修复计算机选项
  7. MySQL:常用分库分表方法
  8. ngnix有版本要求吗_微信视频美颜功能正式上线,你们都用上了吗?
  9. V神论DAO:DAO不是公司 其去中心化很重要
  10. 为什么我支持滴滴下线顺风车业务?