• xml文件


    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    xml:是一个可扩展的标记语言
     01.很像超文本标记语言(html)
     02.xml文件着重保存或者传输数据,不专注显示
     03.无需预编译
     04.符合w3c标准
     < :   &lt;
     > :   &gt;
     " :   &quot;
     ' :   &apos;
     & :   &amp;
     
     <![CDATA[代码]]> 
     CDATA:  character data 字符数据 
      不会被解析器解析的文本!在CDATA标签中定义的代码 不会被当作标记!
      
     PCDATA: parsed character data  被解析的字符数据
      -->
    
    <students>
      <student id="001" name="小黑黑" score="&gt;80">我是小黑黑</student>
      <student id="002" name="大黑黑" score="&lt;80">我是大黑黑</student>
    </students>
     <![CDATA[  "" ;; ''  <><><  ]]>
    第一个xml文件
    /**
    
    什么是标记???  计算机所能理解的一种信息符号!我们之前定义的变量,java中的基本数据类型=====理解成标记!
    
    xml:是一种可扩展的标记语言!  
    01.专注于保存数据,传输!不是显示数据!
    02.xml文件中的标签没有被定义,我们可以自定义标签名称! 
     <student name="admin"></student> 
      <学生  姓名="小白"></学生>
    03.自我描述性
    04.符合W3C标准的!
    
    
    Dom: 文档对象模型(Document  Object Model):dom把xml文件映射成倒挂的树
    
    解析xml的4中解析器!
    Dom:基于xml文档树结构的解析!把文件的内容读取到内存中,比较占内存!消耗资源
    SAX:基于事件的解析!不需要将数据存储在内存中!占用资源少!
    JDom:第一个java特定模型! 2 8原则!本身不包含解析器!使用SAX2解析器来解析xml文件!
    Dom4j:是Jdom的一个分支!分享源代码! 性能优异!功能强大!
    
    
    <student age="50">小黑</student> 
    student:元素名
    age:属性名
    50:属性值
    小黑:元素内容
    
    特殊字符:
    <     &lt;
    >     &gt;
    &     &amp;
    '     &apos;
    "     &quot;
    
    
    CDATA:不被xml解析器解析!
     <![CDATA[内容]]>
    
    
    
    */
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE  school[       //声明这是一个 school类型的文档
    <!ELEMENT school(teacher)>  //根节点是 school   下面只能有teacher
    <!ELEMENT teacher(student+)>  //teacher可以有至少一个student节点
    <!ELEMENT teacher(student*)>  //teacher可以有多个,也可以没有
    <!ELEMENT teacher(student?)>  //teacher可以有1个,也可以没有
    <!ATTLIST teacher             //定义teacher节点中可以有的属性
        ID  CDATA   #REQUIRED    // #REQUIRED 属性值是 必须的   #IMPLIED 属性值不是必须的  EMPTY 空的
        name  CDATA  "false">
    ]>
    创建一个dtd文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!--  引入外部的dtd文档 -->
    <!DOCTYPE school SYSTEM"my.dtd">
    创建一个xml引入dtd文件

     =====================DOM解析xml文件=================================

    <?xml version="1.0" encoding="UTF-8"?>
    <PhoneInfo>
          <Brand name="华为">
                   <Type name="P9"/>
          </Brand>
          <Brand name="苹果">
                <Type name="Iphone6"/>
                <Type name="Iphone7"/>
          </Brand>    
    </PhoneInfo>
    public class DomXml {
        //声明文档树
      static  Document document=null;
        
        /**
         * 使用Dom解析xml文件
         */
        public static void main(String[] args) {
            getDom();
             delPhone();
        }
        
        /**
         * 获取dom树
         */
        public  static  void  getDom(){
            try {
                //01.创建解析器工厂
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                //02.创建解析器
                DocumentBuilder builder = factory.newDocumentBuilder();
                //03.指定需要解析的xml文件  获得整个dom树
                document = builder.parse("收藏信息.xml");
                //04.获取xml文件的根节点
                NodeList list = document.getElementsByTagName("Brand");
                System.out.println("有几个Brand节点:"+list.getLength());
                for (int i = 0; i < list.getLength(); i++) {
                       Node node = list.item(i);
                      Element element= (Element) node;
                    System.out.println("手机名称===》"+element.getAttribute("name"));  
                    //怎么获取手机下面的品牌信息
                    NodeList cList = element.getChildNodes();
                    for (int j = 0; j < cList.getLength(); j++) {
                          Node cNode = cList.item(j);
                          //先判断cNode是否是一个元素节点
                          if (cNode.getNodeType()==Node.ELEMENT_NODE) {
                              Element cElement= (Element) cNode;
                              System.out.println("手机品牌===》"+cElement.getAttribute("name"));
                        }
                    }
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //把内存中的数据  保存在xml中
        public static void saveXml()  {
                try {
                    //???怎么把内存中的 节点 保存到xml中
                    //01.创建转换器工厂
                    TransformerFactory factory = TransformerFactory.newInstance();
                    //02.创建转换器对象
                    Transformer former = factory.newTransformer();
                    //这是我们输出格式
                    former.setOutputProperty("indent", "yes");
                    //03.从内存中 输出到  xml文件     输出流
                    DOMSource source=new DOMSource(document);
                    
                    StreamResult result=new StreamResult(new  OutputStreamWriter
                            (new FileOutputStream("收藏信息.xml"), "utf-8"));
                    
                    former.transform(source, result);
                } catch (TransformerConfigurationException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (TransformerException e) {
                    e.printStackTrace();
                }
            }
        
        /**
         * 新增手机信息
         */
        public  static void  addPhone(){
             //在内存中首先  创建我们需要增加的 节点
            Element element = document.createElement("Brand");
            //增加属性
            element.setAttribute("name", "金立");
            //再创建一个节点   只有文档树可以创建节点
            Element elementType = document.createElement("Type");
            elementType.setAttribute("name", "金立555");
            //把type节点放入Brand中
            element.appendChild(elementType);
            //获取根节点
            document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
            //以上的操作 全都是在 内存中!  并没有真正的保存到xml文件中
            saveXml();  //shift +alt +M 选中的区域提取成方法
        }
    
        /**
         * 修改手机信息
         */
        public  static  void  updatePhone(){
            //获取需要修改的节点
            NodeList list = document.getElementsByTagName("Brand");
            //循环操作
            for (int i = 0; i < list.getLength(); i++) {
                 Node node = list.item(i);
                 Element element=(Element) node;
                 if (element.getAttribute("name").equals("金立")) {
                    element.setAttribute("name", "三星");
                }
            }
            //把内存中修改的数据 保存到xml
            saveXml();
        }
        
        /**
         * 删除指定的手机信息
         */
        public  static  void  delPhone(){
            //获取需要修改的节点
            NodeList list = document.getElementsByTagName("Brand");
            //循环操作
            for (int i = 0; i < list.getLength(); i++) {
                Node node = list.item(i);
                Element element=(Element) node;
                if (element.getAttribute("name").equals("三星")) {
                    element.getParentNode().removeChild(element);
                }
            }
            //把内存中删除的数据 保存到xml
            saveXml();
        }
        
        
        
    
    }
    public class Dom4jTest { // Dom4j解析xml
        // 因为所有的方法都需要Dom树
        static Document document = null;
        static Element root = null;
    
        public static void main(String[] args) {
            // 获取dom树
            getDocument();
            // addPhone();
            deletePhone();
            updatePhone();
            showPhone();
        }
    
        // 解析xml文件
        public static void getDocument() {
            SAXReader reader = new SAXReader();
            try {
                document = reader.read("收藏信息.xml");
                root = document.getRootElement();// 获取根节点
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 显示所有的手机信息
         */
        public static void showPhone() {
            // 遍历所有的节点
            Iterator itBrand = root.elementIterator();
            while (itBrand.hasNext()) {
                Element brand = (Element) itBrand.next();
                System.out.println("手机的品牌是:" + brand.attributeValue("name"));
                System.out.println("手机的编号是:" + brand.attributeValue("id"));
                System.out.println("===========下面是子节点============");
                Iterator itType = brand.elementIterator();
                while (itType.hasNext()) {// 获取手机型号
                    Element type = (Element) itType.next();
                    System.out.println("手机的型号是:" + type.attributeValue("name"));
                    // 输出文本节点的值
                    if (!type.getText().equals("")) {
                        System.out.println(type.getTextTrim());
                    }
                }
            }
    
        }
    
        // 保存xml信息
        public static void save(String path) {
            OutputFormat format = null;
            XMLWriter writer = null;
            try {
                // dom4j的转换器 不用使用 new   createPrettyPrint底层有 new
                format = OutputFormat.createPrettyPrint();
                // 写入xml文件
                writer = new XMLWriter(new FileWriter(path), format);
                writer.write(document);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关流
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 新增节点
        public static void addPhone() {
            Element element = root.addElement("Brand");
            // 节点设置属性
            element.addAttribute("name", "黑莓");
            // 节点下面新增子节点
            Element type = element.addElement("Type");
            type.addAttribute("name", "A1");
            // 保存 省略 我们 节点之间的拼接! dom需要拼接
            save("收藏信息.xml");
        }
    
        // 删除
        public static void deletePhone() {
            // 获取所有Brand
            Iterator brand = root.elementIterator();
            while (brand.hasNext()) {
                Element element = (Element) brand.next(); // 拿到每一个Brand
                // 获取属性值 判断是不是 要删除的对象
                if (element.attributeValue("name").equals("黑莓")) {
                    element.getParent().remove(element);
                }
            }
            save("收藏信息.xml");
        }
    
        // 修改
        public static void updatePhone() {
            // 获取所有Brand
            Iterator brand = root.elementIterator();
            while (brand.hasNext()) {
                Element element = (Element) brand.next(); // 拿到每一个Brand
                // 获取属性值 判断是不是 要修改的对象
                if (element.attributeValue("name").equals("哇哈哈")) {
                    element.attribute("name").setValue("哇哈哈哈哈");
                }
            }
            save("收藏信息.xml");
        }
    
    }
    使用dom4j解析 需要引入需要的jar包

    覆盖xml文件

    public class ParseXml {
        
        
        
        public static void main(String[] args) throws IOException {
            saveXml("user.xml");
        }
        /**
         * 
         * @param path  需要覆盖的xml文件
         * @throws IOException
         */
        public static void  saveXml(String  path) throws IOException{
            Document document=DocumentHelper.createDocument();  //创建一个dom对象
             //给dom增加根节点
            Element students = document.addElement("Students");
            //在根节点下面增加 子节点
            Element student = students.addElement("Student");
            //给子节点增加属性
            student.addAttribute("name","小黑");
            //创建转换器工厂
            OutputFormat format = OutputFormat.createPrettyPrint();
            //设置编码格式
            format.setEncoding("utf-8");
            XMLWriter writer=new XMLWriter(new FileWriter(path), format);
            //写入xml文件
            writer.write(document);
            //关闭流
            writer.close();
        }
        
        
        
        
    
    }
  • 相关阅读:
    java中==和equels的区别
    synchronized的用法及原理
    分库分表之Mycat实现
    Mysql架构和索引及性能优化
    Java内存模型与反向代理服务器Nginx
    Spring基础知识
    使用和理解线程池
    知识补充(数据库优化、三大范式)
    最大子数组问题,分治法求解
    Mybatis学习笔记
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7093969.html
Copyright © 2020-2023  润新知