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("用户不存在");
            }
  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13137680.html
Copyright © 2011-2022 走看看