zoukankan      html  css  js  c++  java
  • xml

    1.课堂:
    XML: 可扩展标记语言! 01.很象html(超文本标记语言) 02.着重于数据的保存,不专注显示! 03.无需预编译 04.符合W3C标准 可扩展:我们可以自定义!按照我们自己的规则来定义! 标记:计算机所能认识的信息符号! int a=5; 可以通过a找到5 ! a就是我们的标记! 我们每个人都有一本书,书都是一致的! 有一个教材编号 是每个书唯一的标记! W3C :万维网联盟组织! xml文件注意点: 01.节点要成对出现 有开放标签 和闭合标签 <学校></学校> 02.节点需要正确的嵌套 <学校> <班级> </学校> </班级> 03.在xml文件中 只能有一个根节点 04.严格区分大小写 xml的节点结构,我们称之为dom树! DOM:(Document Object Model)文档对象模型! 我们整个xml文件的节点就是一个 倒挂的dom树! 只有一个根! 特殊字符: > &gt; < &lt; & &amp; ' &apos; " &quot; 如果说 我有一大篇 文字 很多地方都有特殊字符! 一个一个替换很麻烦! 使用CDATA:不被xml文件解析器解析! <![CDATA[内容]]> DTD文件:针对于xml文件的约束文件! 比如说我们写了一个DTD文件,规定了 只能有一个School根节点! School根节点下只能有Grade节点,可以有多个! Grade节点下只能有多个Class节点 Class节点只能有多个Teacher节点 Teacher节点只能有多个Stduent节点 上面的内容就是 约束 ! <School> <Grade> <Class> <Teacher> <Student></Student> </Teahcer> </Class> </Grade> <Grade> <Class> <Teacher> <Student></Student> </Teahcer> </Class> </Grade> </School> DTD文件中的注意点 01. <!ELEMENT package (result-types?, interceptors+, action*)> package节点下可以有result-types interceptors action这三个节点 02.(result-types?, interceptors+, action*) result-types必须位于第一位 interceptors必须位于第二位 action必须位于第三位 03. result-types? ?:指的是 result-types可以有一个,也可以没有 04. interceptors+ 至少有一个 interceptors 05.action* 可以有N个,也可以没有 比如我们现在有一个叫 work.dtd文件 我的xml中引入 <!DOCTYPE work SYSTEM"work.dtd"> 解析xml文件 01.DOM :基于xml文档树结构的解析,把文件中的内容全部读取到内存中,比较占内存,消耗资源多! 02.SAX :基于事件的解析!不会把数据保存在内存中,占用资源小! 03.JDOM:针对于java的特定模型!满足2 8原则!自身没有解析器,依赖于SAX2的解析器! 04.DOM4J:是JDOM的一个分支!源码开放,性能优异,功能强大!
    <?xml version="1.0" encoding="UTF-8"?>
    
    <school> 
    
      <class name="研一" location="一楼"> 
        <student name="小黑1" age="15">小黑1在吃饭</student>  
        <student name="小黑2" age="16"/>  
        <student name="小黑3" age="17">小黑3在撸串</student> 
      </class>  
      
      <class name="研二" location="二楼"> 
        <student name="小白1" age="10"/>  
        <student name="小白2" age="11">小白2在喝酒</student>  
        <student name="小白3" age="12"/> 
      </class>  
      
      <class name="研四" location="四楼"> 
        <student name="老男孩" age="80"/> 
      </class> 
    </school>
    MySchool
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Iterator;
    
    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;
    
    public class Dom4jDemo {
        /**
         * 
         * 01.整个xml文件是一个倒挂的DOM树
         * 02.我们想遍历xml文件中所有的属性内容
         * 03.找到文件   找到文件的根节点
         * 04.在根节点的基础之上 进行遍历
         * 
         * 
         * 任务 :
         * 
         *   实现xml文件中 节点的   增删 改查
         * 
         * 01.这4个功能都需要找到文件和根节点
         * 02.都需要dom
         * 03.都需要根节点
         * 04.我们就把需要的 dom 和根节点 定义成 成员变量
         */
    
        static Document document = null; // 倒挂的DOM树
        static Element root = null; // 根节点
    
        public static void main(String[] args) {
            getDocument(); // 加载dom树 获取根节点
            // 新增节点insertByXml();
            // 删除节点deleteByXml();
            // 修改
            updateByXml();
    
            listByXml(); // 遍历所有节点属性
        }
    
        /**
         * 解析xml文件   是把xml文件中的内容读到内存中   输入流
         * 01.找文件
         * 02.根据dom树到根节点
         */
        public static void getDocument() {
            SAXReader reader = new SAXReader(); // 创建解析器
            try {
                document = reader.read("src/MySchool.xml"); // 把文件中所有的内容读取到了dom树
                root = document.getRootElement(); // 获取根节点
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 查询xml文件中所有的内容
         */
        public static void listByXml() {
            // 根据根节点 遍历所有的子节点
            Iterator eClass = root.elementIterator();
            while (eClass.hasNext()) { // 遍历 class 节点
                Element className = (Element) eClass.next();
                System.out.println("年级的名称是:" + className.attributeValue("name"));
                System.out
                        .println("年级的位置是:" + className.attributeValue("location"));
                System.out
                        .println("===================================================");
                Iterator eStudent = className.elementIterator();
                while (eStudent.hasNext()) { // 遍历 student节点
                    Element studentName = (Element) eStudent.next();
                    System.out.println("学生的名称是:"
                            + studentName.attributeValue("name"));
                    System.out.println("学生的年龄是:"
                            + studentName.attributeValue("age"));
                    // 输出文本的属性值
                    if (!studentName.getTextTrim().equals("")) {
                        System.out.println("学生在做的事情:" + studentName.getTextTrim());
                    }
                }
            }
        }
    
        /**
         * 新增xml文件的内容
         */
        public static void insertByXml() {
            // 在内存中创建需要的节点
            Element classElement = root.addElement("class");
            // 给class节点增加属性
            classElement.addAttribute("name", "研四");
            classElement.addAttribute("location", "四楼");
            // 以上的结果是 <class name="研四" location="四楼"></class> 在内存中
            // 给class增加子节点
            Element studentElement = classElement.addElement("student");
            studentElement.addAttribute("name", "小屁孩");
            studentElement.addAttribute("age", "80");
            /**
             * 以上的结果在内存中是 
             * <class name="研四" location="四楼">
             *    <student name="小屁孩"  age="80"> </student>
             *  </class> 
             *  
             *  仅限于在内存中  并没有保存到 xml文件中
             */
            saveXml();
    
        }
    
        /**
         * 在内存中的数据 持久化到 xml文件中
         */
        private static void saveXml() {
            XMLWriter writer = null;
            OutputFormat format = null;
            try {
                format = OutputFormat.createPrettyPrint(); // 格式化我们新增的xml节点
                writer = new XMLWriter(new FileWriter("src/MySchool.xml"), format);
                writer.write(document);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        /**
         * 删除xml文件的内容
         */
        public static void deleteByXml() {
    
            // 根据根节点 遍历所有的子节点
            Iterator eClass = root.elementIterator();
            while (eClass.hasNext()) { // 循环找到需要删除的节点
                Element name = (Element) eClass.next();
                if (name.attributeValue("name").equals("研三")) {
                    // 找到父节点 让父节点删除
                    eClass.remove();
                }
            }
            saveXml(); // 持久化保存
        }
    
        /**
         * 修改xml文件的内容
         */
        public static void updateByXml() {
    
            // 根据根节点 遍历所有的子节点
            Iterator eClass = root.elementIterator();
            while (eClass.hasNext()) { // class
                Element name = (Element) eClass.next();
                Iterator studentElement = name.elementIterator();
                while (studentElement.hasNext()) { // student
                    Element studentName = (Element) studentElement.next();
                    if (studentName.attributeValue("name").equals("小屁孩")) {
                        studentName.setAttributeValue("name", "老男孩");
                    }
                }
            }
            saveXml(); // 持久化保存
    
        }
    
    }
    xml增删改查
  • 相关阅读:
    java.lang.ArrayIndexOutOfBoundsException异常分析及解决
    Android_开发片段(Part 2)
    保存错误日志回传服务器之回传错误“信息文件”
    node.js
    拼接json
    CommonJS / Node.js/ Vue学习资料
    合并PDF
    java 多线程
    linux 运行jar包
    mvn 命令
  • 原文地址:https://www.cnblogs.com/wwlw/p/7591311.html
Copyright © 2011-2022 走看看