zoukankan      html  css  js  c++  java
  • 如何用DOM4J解析XML

    认识XML

      XML是Extensible Markup Language 即可扩展标记语言的缩写,是一种简单的数据储存语言,使用一系列简单的标记来描述数据

            <element_name attribute_name="value" .../>        // 自闭合
            <element_name attribute_name="value" ...>        //
            1-String
            2-<element_name attribute_name="value" .../>
            3-<element_name attribute_name="value" .../>
            ...
            </element_name>
    
            </element_name>    对                        

    XML的四种解析 

      目前常用的XML解析技术有4种:

    (1)DOM

      DOM是基于XML的树结构来完成解析的,DOM解析XML的方式非常适用于多次访问XML的应用程序,但是其比较消耗资源;

    (2)SAX

      SAX是一种基于事件的解析,其主要是为了解决DOM解析的资源消耗问题而出现的,其优势是占用资源少,内存消耗小,一般在处理解析数据量大的XML文档才会使用

    (3)JDOM

      JDOM的目的是直接为JAVA编程服务,利用纯Java技术对XML文档实现解析生成,序列化以及其他操作;

    (4)DOM4J
      DOM4J具有性能优异、功能强大和易用的特点,同时它也是一个开放源代码的软件

    如何用DOM4J解析XML数据

    注:使用DOM4J解析XML,依赖于jar包 dom4j和jaxen

      实现的步骤:

        指定要解析的XML文件;

        把XML文件转换成Document对象;

        获取节点属性或文本的值。

            File xml = new File("xmlfiles/xxx");
            SAXReader reader = new SAXReader();
            Document doc = reader.read(xml);//转换为文件
            Element root = doc.getRootElement();//获取节点属性
            List<Element> elements = root.elements();   //element 节点

     

    下面举一例分别分析xml文档

      xml文档内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    
    <root> 
      <student id="1"> 
        <name>张飞</name>
        <age>999</age>
        <gender>男</gender> 
      </student>  
      <student id="2"> 
        <name>关羽</name>
        <age>888</age>
        <gender>男</gender>
      </student>  
      <student id="3">
        <name>刘备</name>
        <age>777</age>
        <gender>男</gender>
      </student> 
    </root>

    若要读取XML文档中,可以直接用字符串输出的方式遍历,首先获取子元素,再遍历子元素文本

            //字符串输出
            for (Element element : elements) {
                String id = element.attributeValue("id");//获取当前指定子元素
                System.out.print(id+"	");
                List<Element> subEs = element.elements();
                for (Element subE : subEs) {
                    System.out.print(subE.getText()+"	");//获取当前子元素文本
                }
                System.out.println("
    ");
            }

    对于一个XML文档,我们也许需要检索所有的内容,但有时也可能需要检索某一固定节点或某一个属性,因此我们需要采取不同的检索方式

      (1)当我们需要检索所有内容时,可以用动态数组的形式遍历出来即可;

      (2)当需要检索某一固定节点

        Node node = document.selectSingleNode("//nodeName[@attrName = value]");

      (3)检索某一属性(多节点检索)

        List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']");

       取一分析结果,输出如下

     //检索固定节点
            Node node = doc.selectSingleNode("//student[@id=3]");//任意以student为根的节点
           if (null != node){
               Element element =(Element)node;
               String id = element.attributeValue("id");
               String name = element.elementText("name");
               String age = element.elementText("age");
               String gender = element.elementText("gender");
               Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender);
               System.out.println(student);
           }

    当我们需要对XML文件进行改动时,有三种情况分别为新增、删除以及修改(变动过之后必须落盘)

      (1)新增

        Element ele = root.addElement(...);

        Element subEle = ele.addElement(String nodeName);

      (2)删除

        Element xxx = ...

        father.renmove(xxx);

      (3)修改

        xxx.attribute(String attrName).setValue(String value);

        xxx.element(String subName).setText(String text);

      下面例子为删除操作

      

    //删除
            //内存操作
            Node node = doc.selectSingleNode("//xxx[@id=3]");
            if (null != node){
                root.remove(node);
                //存盘
                OutputFormat format  = OutputFormat.createPrettyPrint();
                XMLWriter writer = new XMLWriter(new OutputStreamWriter(
                    new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format);
                writer.write(doc);
                writer.flush();
                writer.close();
            }else {
                System.out.println("用户不存在");
            }
  • 相关阅读:
    poj 3436 (最大流)
    C#.NET学习笔记11,12---布尔表达式2组合,if语句
    C++编程规范和标准总结
    hdu 4627 水数学题
    jquery第二期:三个例子带你走进jquery
    Java核心技术,让计算机"一芯多用"的多线程技术
    leetcode_question_73 Set Matrix Zeroes
    Frame动画
    HDU 4602 Partition
    Linux Kernel代码艺术——系统调用宏定义
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13137680.html
Copyright © 2011-2022 走看看