阿飞飞飞

学而时习之

导航

如何用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+"\t");
            List<Element> subEs = element.elements();
            for (Element subE : subEs) {
                System.out.print(subE.getText()+"\t");//获取当前子元素文本
            }
            System.out.println("\n");
        }

 

 

对于一个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("用户不存在");
        }

 

posted on 2020-06-16 08:22  阿飞飞飞  阅读(2868)  评论(0编辑  收藏  举报