zoukankan      html  css  js  c++  java
  • xml文件以及解析

    1、创建一个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文件

    2、创建一个dtd文件

    <?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文件

    3、创建一个xml文件引入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" standalone="no"?>
    <PhoneInfo> 
      <Brand id="1" name="华为">
        <Type name="U8650"/>  
        <Type name="HW123"/>  
        <Type name="HW321"/> 
      </Brand> 
       
      <Brand id="2" name="苹果"> 
        <Type name="iPhone4"/>
        <Type name="iPhone8"/>
      </Brand>  
    <Brand id="3" name="诺基亚">
    <Type name="N95"/>
    </Brand>
    <Brand id="4" name="诺基亚">
    <Type name="N95"/>
    </Brand>
    </PhoneInfo>
    4、DOM树解析----------------------------------------------------
    收藏信息.xml文件 放在项目的根目录下
    public class DomTest { // 使用DOM (Document Object Model)解析xml 文件
        // 因为所有的方法都需Dom树
        static Document document = null;
    
        public static void main(String[] args) {
            showPhone(); // 显示所有的手机信息
            addPhone();
            updatePhone();
            deletePhone();
            System.out.println("************************");
            showPhone(); // 显示所有的手机信息
        }
    
        /**
         * 显示所有的手机信息
         */
        public static void showPhone() {
            DocumentBuilderFactory factory = null;
            DocumentBuilder builder = null;
            try {
                // 01.创建解析器工厂
                factory = DocumentBuilderFactory.newInstance();
                // 02.创建解析器对象
                builder = factory.newDocumentBuilder();
                // 03.解析指定的xml文件
                document = builder.parse("收藏信息.xml");
                /**
                 * 04.获取手机的节点  NodeList接口中 只有 两个方法   
                 * item(int  index) 根据下标  获取 Node
                 * getLength()  获取集合大小
                 */
                NodeList list = document.getElementsByTagName("Brand");
                System.out.println("集合的大小:" + list.getLength());
                for (int i = 0; i < list.getLength(); i++) {
                    Node node = list.item(i); // 没有获取属性的方法 Element接口实现 Node接口
                    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) {
                e.printStackTrace();
            }
        }
    
        /**
         * 新增手机信息
         */
        public static void addPhone() {
            // 在dom树上新增节点 <Brand></Brand>
            Element element = document.createElement("Brand");
            // 增加属性 <Brand name="诺基亚"></Brand>
            element.setAttribute("name", "诺基亚");
            // 再创建一个节点 相当于 诺基亚的子节点
            Element elementType = document.createElement("Type");
            /**
             * <Brand name="诺基亚"> </Brand>
             *  <Type name="N95"></Type>
             *  把Type节点放入Brand节点中
             */
            elementType.setAttribute("name", "N95");
            /**
             * 给节点增加子节点
             * <Brand name="诺基亚">
             *   <Type name="N95"/>
             *  </Brand>
             *  还是没有放入根节点  PhoneInfo
             */
            element.appendChild(elementType);
            /**
             * 获取根节点PhoneInfo  把 element整体放入PhoneInfo
             */
            document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
            // 上面的操作都在在内存中创建的对象 并没有真正的 保存到xml文件
            savePhone("收藏信息.xml");
    
        }
    
        /**
         * 保存xml信息
         */
        private static void savePhone(String path) {
            TransformerFactory factory = null;
            Transformer fomer = null;
            try {
                // 创建转换器工厂
                factory = TransformerFactory.newInstance();
                // 生成转换器
                fomer = factory.newTransformer();
                fomer.setOutputProperty("indent", "yes");
                // 创建一个输出流 从内存中 写入 电脑的指定文件中
                StreamResult result = new StreamResult(new OutputStreamWriter(
                        new FileOutputStream("收藏信息.xml"), "utf-8"));
                // 对整个DOM树进行解析
                DOMSource source = new DOMSource(document);
                // 转换 保存
                fomer.transform(source, result);
    
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            } catch (TransformerFactoryConfigurationError e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (TransformerException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 修改手机信息
         * 给所有的Brand节点  增加ID属性
         */
    
        public static void updatePhone() {
            NodeList nodeList = document.getElementsByTagName("Brand");
            // 循环新增节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                // 转换成元素 获取方法
                Element element = (Element) node;
                element.setAttribute("id", i + 1 + "");
            }
            savePhone("收藏信息.xml");
        }
    
        /**
         * 删除指定的手机
         * 删除id为4的
         */
        public static void deletePhone() {
            NodeList nodeList = document.getElementsByTagName("Brand");
            // 循环新增节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                // 转换成元素 获取方法
                Element element = (Element) node;
                if (element.getAttribute("id").equals("4")) { // 找到id=4
                    // 从父节点 删除这个节点
                    element.getParentNode().removeChild(element);
                }
            }
            savePhone("收藏信息.xml");
        }
    
    }
    使用dom解析的代码

    5、Dom4j解析-----------------------------------------------------------------------------------------

    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");
        }
    
    }
  • 相关阅读:
    Silverlight 5 系列学习之一
    WPF中数据绑定问题
    细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看
    再学IHanlder 类----------------关于Asp.net与iis原理网上看博客收获写一个验证码用一般处理程序记的好长时间前就写过不过现在再看有点不一样的感觉
    Oracle常用查看表结构命令
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。(遇到了这个问题网上查了下保存下来)
    TxetBox PasswordChar 模式解除
    屏幕抖动一 下
    oracle 日期问题 网上找到自己查阅时方便
    day5-Dns
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/7039282.html
Copyright © 2011-2022 走看看