高级编程--第七章 XML

灌篮少年  金牌会员 | 7 天前 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 503|帖子 503|积分 1509

1、目的

理解XML该你那及优势
回避那些格式良好的XML文档
了解XML中特殊字符的处理惩罚方式
了解解析器概念
了解DOM树节点构造
会使用Dom操作XML数据(添加/生存)

2、XML简介

XML(EXtensible Markup Language),可扩展标记语言,是一种简单的基于文本的语言,旨在以村文本格式存储和传输数据,他代表可扩展标记语言。


  • XML 是一种标记语言。
  • XML 是一种类似于 HTML 的基于标签的语言。
  • XML 标记不像 HTML 那样预定义。
  • 您可以定义自己的标签,这就是它被称为可扩展语言的原因。
  • XML 标签被设计成自我形貌的。
  • XML 是用于数据存储和数据传输的 W3C 保举尺度。
特点
XML与操作系统、编程语言的开辟平台无关
实现差别系统之间的数据交换


  • 与技能无关 − 作为纯文本,XML 与技能无关。 它可以被任何技能用于数据存储和数据传输目的。
  • 人类可读 − XML 使用简单的文本格式。 它是人类可读且易于理解的。
  • 可扩展 − 在 XML 中,可以非常轻松地创建和使用自定义标签。
  • 允许验证 − 使用 XSD、DTD 和 XML 结构可以很轻易地进行验证。
作用
数据交互
设置应用程序和网站
Ajax基石
缺点


  • 冗余语法 − 通常 XML 文件包罗很多重复的术语。
  • 冗长 − 作为一种冗长的语言,XML 文件的大小增加了传输和存储本钱。
XML文档结构



  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <books>
  3.     <!--图书信息 -->
  4.     <book id="bk101">
  5.         <author>王珊</author>
  6.         <title>.NET高级编程</title>
  7.         <description>包含C#框架和网络编程等</description>
  8.     </book>
  9.     <book id="bk102">
  10.         <author>李明明</author>
  11.         <title>XML基础编程</title>
  12.         <description>包含XML基础概念和基本作用</description>
  13.     </book>
  14. </books>
复制代码
XML标签

XML文档内容由一系列标签元素组成
  1. <元素名 属性名="属性值">元素内容</元素名>
  2. //空元素
  3. <name> </name>
  4. <name></name>
  5. </name>
复制代码
属性值用双引号包裹
一个元素可以有多个属性
属性值不能直接包罗 <、"、&
不发起使用的字符 ‘、>
XML编写注意事项

全部XML元素都必须有竣事标签
XML标签对大小写敏感
XML必须精确的嵌套
同级标签以缩进对齐
元素名称可以包罗字母、数字、或其他的字符
元素名称不能以数字或者标点符号开始
元素名称不能包罗空格

指出先民啊XML代码的错误
  1. <title><name>XML编程</title></name>   //标签嵌套错误
复制代码
XML语法

XML语法由三大部分组成
文档头部声明
  1. <?xml version="1.0" encoding="UTF-8"?>
复制代码
文档类型声明(非必须)
对文件类型进行阐明的语句,在一些其他技能使用xml文件进行操作时会使用到。比方MyBatis的xml映射以及http文件等。
  1. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  2.     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">       
复制代码
文档体
使用 <label-name>message</lable-name> 方式构成的标签语句。
abel-name: 标签名称
message: 标签内容,标签内容可以使其他标签,也可以是单纯的文本字符串。
属性命名空间

  1. <?xml version="1.0" encoding="UTF-8"?><batchCompany xmlns="http://www.Aptech_edu.ac"    xmlns:tea="http://www.tea.org">    <batch-list>        <batch type="thirdbatch">第三批次</batch>        <batch tea:type="thirdbatch">第三批茶</batch>        <batch>午班批次</batch>    </batch-list></batchCompany>
复制代码
除非带有前缀,否则属性属于所属的元素的命名空间

XML解析器

解析器类型
非验证解析器
检查文档格式是否良好
验证解析器
使用DTD检查文档的有效性

XML命名空间

XML命名空间的作用
解决在复杂、大型XML文件中,出现名称雷同,但是寄义差别的元素
  1. <?xml version="1.0" encoding="UTF-8"?><cameras xmlns:canon="http://www.canon"    xmlns:nikon="http://www.nikon.com">    <canon:camera prodID="P663" name="Camera傻瓜相机"/>    <nikon:camera prodID=“K29B3” name=“Camera超等35毫米相机"/></cameras>
复制代码
解析XML技能

有四种:
内置:DOM(一般针对于小文件) 、SAX(大文件,以流式来进行处理惩罚)
内置的两种方式并不太行
扩展:JDOM(自己维护,缺乏团队,慢慢清除)、Dom4J()
  1. DOM
  2. 基于XML文档树结构的解析
  3. 适用于多次访问的XML文档
  4. 特点:比较消耗资源
  5. SAX
  6. 基于事件的解析
  7. 适用于大数据量的XML文档
  8. 特点:占用资源少,内存消耗小
  9. DOM4J
  10. 非常优秀的Java XML API
  11. 性能优异、功能强大
  12. 开放源代码
复制代码
Dom解析XMl
Dom介绍
文档对象模子(Document Object Model)
Dom吧XMl文档映射成一个倒挂的树


常用接口介绍
DOM解析包:org.w3c.dom
常用接口
常用方法
阐明
Document:表现整个 XML 文档
NodeList getElementsByTagName(String Tag)
按文档顺序返回文档中指定标记名称的全部元素聚集
Element createElement(String tagName)
创建指定标记名称的元素
Node:该文档树中的单个节点
NodeList getChildNodes()
获取该元素的全部子节点,返回节点聚集
Element:XML 文档中的一个元素
String getTagName()
获取元素名称
访问DOM树节点
显示“收藏信息.XML”文件中收藏的手机品牌和型号
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <PhoneInfo>
  3.     <Brand name="华为">
  4.         <Type name="U8650"/>
  5.         <Type name="HW123"/>
  6.         <Type name="HW321"/>
  7.     </Brand>
  8.     <Brand name="苹果">
  9.         <Type name="iPhone4"/>
  10.     </Brand>
  11. </PhoneInfo>
复制代码
  1. DOM解析XML文件步骤
  2.   1.创建解析器工厂对象
  3.   2.解析器工厂对象创建解析器对象
  4.   3.解析器对象指定XML文件创建Document对象
  5.   4.以Document对象为起点操作DOM树
复制代码
  1. package Test;
  2. import org.w3c.dom.Document;
  3. import org.w3c.dom.Element;
  4. import org.w3c.dom.NodeList;
  5. import org.xml.sax.SAXException;
  6. import sun.security.tools.keytool.Main;
  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;
  9. import javax.xml.parsers.ParserConfigurationException;
  10. import javax.xml.soap.Node;
  11. import javax.xml.soap.SAAJMetaFactory;
  12. import java.io.FileInputStream;
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. import java.util.List;
  16. /**
  17. * @Author: Insight
  18. * @Description: Dom解析XMl
  19. * @Date: 2024/9/11 15:50
  20. * @Version: 1.0
  21. */
  22. public class Test {
  23.     public static void main(String[] args) {
  24.         try {
  25.             //创建解析工厂对象
  26.             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  27.             //解析器工厂对象创建解析器对象
  28.             DocumentBuilder db = dbf.newDocumentBuilder();
  29.             //解析器对象指定XML文件创建Document对象
  30.             Document d = db.parse("./src/Test/cloth.xml");
  31.             d.getDocumentElement().normalize();
  32.             //以Document对象为起点操作Dom树
  33.             //获取根节点
  34.             Element element = d.getDocumentElement();
  35.             //通过根节点获取子节点
  36.             NodeList nodeList = element.getElementsByTagName("size");
  37.             for (int i = 0;i<nodeList.getLength();i++){
  38.                 //获取子节点下的数据
  39.                 System.out.println(nodeList.item(i).getTextContent());
  40.             }
  41.         } catch (Exception e) {
  42.             e.printStackTrace();
  43.         }
  44.     }
  45. }
复制代码

生存XML文件




  1. package Test02;
  2. import org.w3c.dom.Document;
  3. import org.w3c.dom.Element;
  4. import javax.print.Doc;
  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;
  7. import javax.xml.transform.OutputKeys;
  8. import javax.xml.transform.Transformer;
  9. import javax.xml.transform.TransformerConfigurationException;
  10. import javax.xml.transform.TransformerFactory;
  11. import javax.xml.transform.dom.DOMSource;
  12. import javax.xml.transform.stream.StreamResult;
  13. import java.io.File;
  14. /**
  15. * @Author: Insight
  16. * @Description: TODO
  17. * @Date: 2024/9/11 18:52
  18. * @Version: 1.0
  19. */
  20. public class Test {
  21.     public static void main(String[] args) {
  22.         try {
  23.             //创建工厂TransformerFactory
  24.             TransformerFactory tf = TransformerFactory.newInstance();
  25.             //创建Transformer对象
  26.             Transformer t = tf.newTransformer();
  27.             //创建DOMSource对象,需要创建Document对象来创建新的XML文件
  28.             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  29.             DocumentBuilder db = dbf.newDocumentBuilder();
  30.             Document d = db.newDocument();
  31.             //创建XML结构
  32.             //创建根节点
  33.             Element rootElement = d.createElement("root");
  34.             //加入树中
  35.             d.appendChild(rootElement);
  36.             //创建子节点
  37.             Element childElement = d.createElement("child");
  38.             //设置属性名和属性值
  39.             childElement.setAttribute("attr","value");
  40.             //设置子节点文本内容
  41.             childElement.appendChild(d.createTextNode("Text Content"));
  42.             //加入根节点树中
  43.             rootElement.appendChild(childElement);
  44.             //将文件添加入DOMsource中
  45.             DOMSource dom = new DOMSource(d);
  46.             //设置输出属性
  47.             //设置是否再XML中添加缩进
  48.             t.setOutputProperty(OutputKeys.INDENT,"yes");
  49.             //指定输出方法
  50.             t.setOutputProperty(OutputKeys.METHOD, "xml");
  51.             //编码格式
  52.             t.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
  53.             //创建StreamResult对象
  54.             StreamResult result = new StreamResult(new File("./src/Test02/output.xml"));
  55.             // 7. 包含保存文件的信息
  56.             // (StreamResult对象已经包含了文件信息)
  57.             // 8. 将XML保存到指定文件中
  58.             t.transform(dom,result);
  59.             System.out.println("已保存文件");
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64. }
复制代码

修改/删除DOM节点

  1. 给所有的Brand标签添加id属性
  2. 获取Brand标签
  3. 调用setAttribute()方法添加属性
  4. 删除Brand值为“华为”的标签
  5. getElementsByTagName()方法获取Brand标签列表
  6. 获得Brand值为“华为”的标签对象
  7. 通过getParentNode()方法获得父节点对象
  8. 调用父节点的removeChild()方法删除节点
复制代码
dom4j解析XML

1. 读取xml文件 SAXReader()

  1. //将xml文件加载到内存中 XML解析器
  2. SAXReader saxReader = new SAXReader();
  3. //document 加载执行xml文档获取Document对象
  4. Document document = saxReader.read(XML路径);
复制代码

2. 获取XML根节点getRootElement()

  1. Element rootElement = document.getRootElement();
复制代码


3. 获取当前节点下全部子节点elements()

  1. //获取根节点下所有子节点
  2. List<Element> Elist = rootElement.elements();
复制代码
4. 根据指定子元素名,获取元素下全部子节点

  1. //获取节点名称为books下所有子节点
  2. List<Element> Elist = rootElement.elements(“books”);
复制代码

5. 根据指定子元素名,获取子元素对象,如果重复,则获取第一个

  1. //获取节点名称为books下单个子节点
  2. Element element= rootElement.element(“books”);
复制代码


6. 设置元素文本内容setText()

  1. newelement.setText("内容");
复制代码

7. 获取当前节点文本内容getText()

  1. elenent.getText()
复制代码
8. 根据指定子元素名,获取元素中的文本

  1. e.elementText(“book”)
复制代码

9. 获取当前节点属性attributeValue(“属性名”)

  1. e.attributeValue("name")
复制代码
11.创建节点Element对象.addElement("节点名")

  1. Element newelement = rootElement.addElement("span");
复制代码

12.节点添加,修改属性Element对象.addAttribute("节点属性名",“属性值”)

  1. newelement.addAttribute("type","属性值");
复制代码

13.新XML添加Documen对象

通过DocumentHelper.creatDocument()创建一个Document对象
  1. Document read = DocumentHelper.createDocument();
复制代码

14.设置XML编码

通过OutputFormat的静态方法createPrettyPrint()创建OutputFormat对象,并设置编码集
  1. OutputFormat outputFormat=OutputFormat.createPrettyPrint();
  2. outputFormat.setEncoding("UTF-8");
复制代码

15.写入XML文件

  1. //写入XML文件的位置 以及指定的格式
  2. XMLWriter xmlWriter=new XMLWriter(new FileWriter("cs.xml"),outputFormat);
  3. //开始写入XML文件   写入Document对象
  4. xmlWriter.write(document);
  5. xmlWriter.close();
复制代码

训练

训练一

需求阐明将表中的数据用XML文档表现出来
学生姓名
预计得分
实际得分
王显明
75
80
宋佳
75
88
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <students>
  3.     <student>
  4.         <name>王显明</name>
  5.         <prescore>75</prescore>
  6.         <actscore>80</actscore>
  7.     </student>
  8.     <student>
  9.         <name>宋佳</name>
  10.         <prescore>75</prescore>
  11.         <actscore>88</actscore>
  12.     </student>
  13. </students>
复制代码
训练二

显示“收藏信息.xml”文件中收藏的手机品牌和型号
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <PhoneInfo>
  3.     <Brand name="华为">
  4.         <Type name="U8650"/>
  5.         <Type name="HW123"/>
  6.         <Type name="HW321"/>
  7.     </Brand>
  8.     <Brand name="苹果">
  9.         <Type name="iPhone4"/>
  10.     </Brand>
  11. </PhoneInfo>
复制代码

Test
  1. package exercise01;
  2. import org.w3c.dom.Document;
  3. import org.w3c.dom.Element;
  4. import org.w3c.dom.Node;
  5. import org.w3c.dom.NodeList;
  6. import javax.xml.parsers.DocumentBuilder;
  7. import javax.xml.parsers.DocumentBuilderFactory;
  8. import javax.xml.parsers.ParserConfigurationException;
  9. import java.util.List;
  10. /**
  11. * @Author: Insight
  12. * @Description: 使用DOM操作XML
  13. * @Date: 2024/9/11 17:59
  14. * @Version: 1.0
  15. */
  16. public class Test {
  17.     public static void main(String[] args) {
  18.         try {
  19.             //创建工厂对象
  20.             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  21.             //工厂对象创建解析器对象
  22.             DocumentBuilder db = dbf.newDocumentBuilder();
  23.             //创建Document读取XML
  24.             Document d =  db.parse("./src/exercise01/收藏信息.xml");
  25.             //获取根节点
  26.             Element element = d.getDocumentElement();
  27. //            //检查根节点
  28. //            System.out.println(element);
  29.             //根据根节点获取子节点
  30.             NodeList nodeList = element.getElementsByTagName("Brand");
  31.             //根据子节点再获取子节点,并输出信息
  32.             for (int i = 0;i < nodeList.getLength();i++){
  33.                 Element el1 = (Element) nodeList.item(i);
  34.                 System.out.println("品牌:" + el1.getAttribute("name"));
  35.                 for (int j = 0;j < el1.getElementsByTagName("Type").getLength();j++){
  36.                     Element el2 = (Element) el1.getElementsByTagName("Type").item(j);
  37.                     System.out.println("型号:" + el2.getAttribute("name"));
  38.                 }
  39.             }
  40.         } catch (Exception e) {
  41.             e.printStackTrace();
  42.         }
  43.     }
  44. }
复制代码
训练三

需求阐明 添加新的Brand:三星给Brand节点添加新的子标签Type:Note4将Brand添加到DOM树中
  1. package exercise03;
  2. import org.w3c.dom.Document;
  3. import org.w3c.dom.Element;
  4. import org.w3c.dom.Node;
  5. import org.w3c.dom.NodeList;
  6. import javax.xml.parsers.DocumentBuilder;
  7. import javax.xml.parsers.DocumentBuilderFactory;
  8. import javax.xml.parsers.ParserConfigurationException;
  9. import javax.xml.transform.OutputKeys;
  10. import javax.xml.transform.Transformer;
  11. import javax.xml.transform.TransformerFactory;
  12. import javax.xml.transform.dom.DOMSource;
  13. import javax.xml.transform.stream.StreamResult;
  14. import java.io.File;
  15. import java.util.List;
  16. /**
  17. * @Author: Insight
  18. * @Description: 将手机收藏信息保存到文件中
  19. * @Date: 2024/9/11 19:12
  20. * @Version: 1.0
  21. */
  22. public class Test {
  23.     public static void main(String[] args) {
  24.         //读取旧的文件
  25.         try {
  26.             DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance();
  27.             DocumentBuilder builder1 = factory1.newDocumentBuilder();
  28.             //读取文件
  29.             Document document1 = builder1.parse("./src/exercise03/收藏信息.XML");
  30.             //文件写入
  31.             TransformerFactory factory2 = TransformerFactory.newInstance();
  32.             Transformer transformer = factory2.newTransformer();
  33.             //获取根节点信息
  34.             Element rootElement1 = document1.getDocumentElement();
  35.             System.out.println(rootElement1);
  36.             NodeList brands = document1.getElementsByTagName("Brand");
  37.             for (int i = 0;i < brands.getLength();i++){
  38.                 Element brand = (Element) brands.item(i);
  39.                 System.out.println(brand.getAttribute("name"));
  40.                 NodeList types = brand.getElementsByTagName("Type");
  41.                 for (int j = 0;j < types.getLength(); j++){
  42.                     Element type = (Element) types.item(j);
  43.                     System.out.println(type.getAttribute("name"));
  44.                 }
  45.             }
  46.             //文件写入
  47.             Document document2 = builder1.newDocument();
  48.             //创建根节点
  49.             Element rootElement2 = document2.createElement("PhoneInfo");
  50.             document2.appendChild(rootElement2);
  51.             //创建手机品牌节点
  52.             for (int i = 0;i < brands.getLength(); i++ ){
  53.                 Element childElement = document2.createElement("brand");
  54.                 Element brand = (Element) brands.item(i);
  55.                 childElement.setAttribute("name",brand.getAttribute("name"));
  56.                 rootElement2.appendChild(childElement);
  57.                 NodeList types = brand.getElementsByTagName("Type");
  58.                 for (int j = 0; j < types.getLength();j++){
  59.                     Element childElement1 = document2.createElement("Type");
  60.                     Element type = (Element) types.item(j);
  61.                     childElement1.setAttribute("name",type.getAttribute("name"));
  62.                     childElement.appendChild(childElement1);
  63.                 }
  64.             }
  65.             DOMSource dom = new DOMSource(document2);
  66.             transformer.setOutputProperty(OutputKeys.INDENT,"yes");
  67.             transformer.setOutputProperty(OutputKeys.METHOD,"xml");
  68.             transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
  69.             StreamResult result = new StreamResult(new File("./src/exercise03/output.xml"));
  70.             transformer.transform(dom,result);
  71.         } catch (Exception e) {
  72.             e.printStackTrace();
  73.         }
  74.     }
  75. }
  76.         
复制代码
训练四

需求阐明 添加新的Brand:三星给Brand节点添加新的子标签Type:Note4将Brand添加到DOM树中
  1. package exercise04;
  2. import org.w3c.dom.Document;
  3. import org.w3c.dom.Element;
  4. import org.xml.sax.SAXException;
  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;
  7. import javax.xml.parsers.ParserConfigurationException;
  8. import javax.xml.transform.OutputKeys;
  9. import javax.xml.transform.Transformer;
  10. import javax.xml.transform.TransformerConfigurationException;
  11. import javax.xml.transform.TransformerFactory;
  12. import javax.xml.transform.dom.DOMSource;
  13. import javax.xml.transform.stream.StreamResult;
  14. import java.io.File;
  15. import java.io.IOException;
  16. /**
  17. * @Author: Insight
  18. * @Description: TODO
  19. * @Date: 2024/9/11 19:51
  20. * @Version: 1.0
  21. */
  22. public class Test {
  23.     public static void main(String[] args) {
  24.         try {
  25.             DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance();
  26.             DocumentBuilder builder1 = factory1.newDocumentBuilder();
  27.             //读取文件
  28.             Document document1 = builder1.parse("./src/exercise03/收藏信息.XML");
  29.             //文件写入
  30.             TransformerFactory factory2 = TransformerFactory.newInstance();
  31.             Transformer t = factory2.newTransformer();
  32.             //创建XML结构
  33.             //创建根节点
  34.             Element rootElement = document1.createElement("Brand");
  35.             rootElement.setAttribute("name","三星");
  36.             //加入树中
  37.             document1.getDocumentElement().appendChild(rootElement);
  38.             //创建子节点
  39.             Element childElement = document1.createElement("Type");
  40.             //设置属性名和属性值
  41.             childElement.setAttribute("name","Note4");
  42.             //加入根节点树中
  43.             rootElement.appendChild(childElement);
  44.             //将文件添加入DOMsource中
  45.             DOMSource dom = new DOMSource(document1);
  46.             //设置输出属性
  47.             //设置是否再XML中添加缩进
  48.             t.setOutputProperty(OutputKeys.INDENT,"yes");
  49.             //指定输出方法
  50.             t.setOutputProperty(OutputKeys.METHOD, "xml");
  51.             //编码格式
  52.             t.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
  53.             //创建StreamResult对象
  54.             StreamResult result = new StreamResult(new File("./src/exercise04/收藏信息.xml"));
  55.             // 7. 包含保存文件的信息
  56.             // (StreamResult对象已经包含了文件信息)
  57.             // 8. 将XML保存到指定文件中
  58.             t.transform(dom,result);
  59.             System.out.println("已保存文件");
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64. }
复制代码
训练五 使用DOM4J

显示手机收藏信息生存手机收藏信息为手机收藏信息添加新的节点修改/删除手机收藏信息节点
Test
  1. package exercise05;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Element;
  5. import org.dom4j.io.OutputFormat;
  6. import org.dom4j.io.SAXReader;
  7. import org.dom4j.io.SAXWriter;
  8. import org.dom4j.io.XMLWriter;
  9. import java.io.FileWriter;
  10. import java.io.IOException;
  11. import java.util.List;
  12. /**
  13. * @Author: Insight
  14. * @Description: TODO
  15. * @Date: 2024/9/12 12:02
  16. * @Version: 1.0
  17. */
  18. public class Test {
  19.     public static void main(String[] args) {
  20.         //document 假爱执行XML文档 获取Document对象
  21.         try {
  22.             //创建管理对象
  23.             Manager manager = new Manager();
  24.             //读取信息
  25.             manager.Info();
  26.             //添加新节点
  27.             //添加手机品牌节点
  28.             manager.addPhoneBrand("三星");
  29.             //添加手机型号节点
  30.             manager.addPhoneType("三星","utla");
  31.             //修改信息
  32.             //修改品牌信息
  33.             manager.updateBrandName("三星","小米");
  34.             //修改型号信息
  35.             manager.updateTypeName("小米","utla","15promax");
  36.             //保存到新的文件中
  37.             manager.deletebrand("小米");
  38.             //删除品牌下的某一型号
  39.             manager.deleteType("华为","U8650");
  40.             manager.saveXML("./src/exercise05/output.xml");
  41.         } catch (Exception e) {
  42.             e.printStackTrace();
  43.         }
  44.     }
  45. }
复制代码
Manager
  1. package exercise05;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Element;
  5. import org.dom4j.io.OutputFormat;
  6. import org.dom4j.io.SAXReader;
  7. import org.dom4j.io.XMLWriter;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.util.List;
  11. /**
  12. * @Author: Insight
  13. * @Description: TODO
  14. * @Date: 2024/9/12 14:03
  15. * @Version: 1.0
  16. */
  17. public class Manager {
  18.     public Document document;
  19.     public Manager() throws DocumentException {
  20.         SAXReader reader = new SAXReader();
  21.         this.document = reader.read("./src/exercise05/收藏信息.xml");
  22.     }
  23.     //显示手机收藏信息
  24.     public void Info(){
  25.         //获取XML根节点
  26.         Element rootElement = document.getRootElement();
  27.         //获取当前节点下的所有子节点
  28.         List<Element> eList = rootElement.elements();
  29.         //遍历获取子节点下的子节点  (显示手机收藏信息)
  30.         for (Element el1 : eList){
  31.             List<Element> eeList = el1.elements();
  32.             System.out.println("品牌" + el1.attributeValue("name"));
  33.             for (Element el2 : eeList){
  34.                 //显示标签属性值
  35.                 System.out.println("    型号:" + el2.attributeValue("name"));
  36.             }
  37.         }
  38.     }
  39.     //保存信息到新的文件中
  40.     public void saveXML(String filepath) throws IOException {
  41.         OutputFormat output = OutputFormat.createPrettyPrint();
  42.         XMLWriter xmlWriter = new XMLWriter(new FileWriter(filepath),output);
  43.         xmlWriter.write(document);
  44.         System.out.println("保存成功!!!");
  45.         xmlWriter.close();
  46.     }
  47.     //添加新节点
  48.     //添加品牌系欸但
  49.     public void addPhoneBrand(String brandname){
  50.         //获取根节点
  51.         Element root = document.getRootElement();
  52.         //添加品牌节点
  53.         Element brand = root.addElement("Brand");
  54.         brand.addAttribute("name",brandname);
  55.         System.out.println("成功添加 品牌:" + brandname);
  56.     }
  57.     //添加型号节点
  58.     public void addPhoneType(String brandname,String typename){
  59.         Element root = document.getRootElement();
  60.         List<Element> list = root.elements();
  61.         for (int i = 0;i< list.size();i++){
  62.             Element brand = list.get(i);
  63.             if (brand.attributeValue("name").equals(brandname)){
  64.                 //根据品牌名进行添加
  65.                 Element type = brand.addElement("Type");
  66.                 type.addAttribute("name",typename);
  67.                 System.out.println("成功添加 品牌:" + brandname + " 型号:" + typename);
  68.             }
  69.         }
  70.     }
  71.     //修改信息
  72.     //修改品牌信息
  73.     public void updateBrandName(String oldbrnd,String newbrand){
  74.         //获取根节点
  75.         Element root = document.getRootElement();
  76.         //获取所有品牌信息
  77.         List<Element> list = root.elements();
  78.         //遍历找到要修改的品牌
  79.         for (Element el : list){
  80.             if (el.attributeValue("name").equals(oldbrnd)){
  81.                 el.addAttribute("name",newbrand);
  82.                 System.out.println("成功修改 品牌:" + oldbrnd + "为 品牌:" + newbrand);
  83.             }
  84.         }
  85.     }
  86.     //修改型号信息
  87.     public void updateTypeName(String selectbrand,String oldtype,String newtype){
  88.         Element root = document.getRootElement();
  89.         List<Element> list = root.elements();
  90.         for (int i = 0;i< list.size();i++){
  91.             Element brand = list.get(i);
  92.             if (brand.attributeValue("name").equals(selectbrand)){
  93.                 //根据型号名进行查找
  94.                 List<Element> type = brand.elements();
  95.                 for (Element el : type){
  96.                     if (el.attributeValue("name").equals(oldtype)){
  97.                         el.addAttribute("name",newtype);
  98.                         System.out.println("成功修改 型号:" + oldtype + "为 型号:" + newtype);
  99.                     }
  100.                 }
  101.             }
  102.         }
  103.     }
  104.     //删除品牌
  105.     public void deletebrand(String brand){
  106.         //获取根节点
  107.         Element root = document.getRootElement();
  108.         //获取所有品牌信息
  109.         List<Element> list = root.elements();
  110.         //遍历找到要修改的品牌
  111.         for (Element el : list){
  112.             if (el.attributeValue("name").equals(brand)){
  113.                 root.remove(el);
  114.                 System.out.println("成功删除 品牌:" + brand);
  115.             }
  116.         }
  117.         System.out.println("型号修改结束");
  118.     }
  119.     //删除品牌下的某个型号
  120.     public void deleteType(String brandname,String typename){
  121.         Element root = document.getRootElement();
  122.         List<Element> list = root.elements();
  123.         for (int i = 0;i< list.size();i++){
  124.             Element brand = list.get(i);
  125.             if (brand.attributeValue("name").equals(brandname)){
  126.                 //根据型号名进行查找
  127.                 List<Element> type = brand.elements();
  128.                 for (Element el : type){
  129.                     if (el.attributeValue("name").equals(typename)){
  130.                         brand.remove(el);
  131.                         System.out.println("成功删除 品牌:" + brandname + " 型号:" + typename);
  132.                     }
  133.                 }
  134.             }
  135.         }
  136.     }
  137. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表