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");
    }

}

转载于:https://www.cnblogs.com/HHR-SUN/p/7039282.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值