dom4j学习

摘要:
在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便。首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包:dom4jdom4j1.6添加完这个依赖后就可以使用了dom4j了,但是在使用的过程中发现了问题,在使用selectNodes函数时产生了异常。后来上网查询发现还缺少了一些dom4j需要的包,于是还是在中心库中搜了搜,填了一堆进去。

在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便。

首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包:

<dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6</version>
</dependency>

添加完这个依赖后就可以使用了dom4j了,但是在使用的过程中发现了问题,在使用selectNodes函数时产生了异常。

后来上网查询发现还缺少了一些dom4j需要的包,于是还是在中心库中搜了搜,填了一堆进去。可能有多,不过总算能正常工作了。添加的依赖如下

        <dependency>
      <groupId>jaxme</groupId>
      <artifactId>jaxme-api</artifactId>
      <version>0.3</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1-beta-4</version>
        </dependency>
        <dependency>
            <groupId>msv</groupId>
            <artifactId>xsdlib</artifactId>
            <version>20030807</version>
        </dependency>
        <dependency>
            <groupId>msv</groupId>
            <artifactId>relaxngDatatype</artifactId>
            <version>20030807</version>
        </dependency>
        <dependency>
            <groupId>pull-parser</groupId>
            <artifactId>pull-parser</artifactId>
            <version>2</version>
        </dependency>
        <dependency>
            <groupId>stax</groupId>
            <artifactId>stax</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>junitperf</groupId>
            <artifactId>junitperf</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>stax</groupId>
            <artifactId>stax-ri</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.5.1</version>
        </dependency>
        <dependency>
            <groupId>clover</groupId>
            <artifactId>clover</artifactId>
            <version>1.3-rc4</version>
        </dependenc    
View Code

在添加完dom4j依赖之后,我们来介绍一下常用的xml功能。

1.读取,利用SAXReader进行读取,然后进行后续的解析。

File file=new File(path);
SAXReader sr=new SAXReader();
Document doc=sr.read(file);
Element root=doc.getRootElement();

2.遍历所有节点

public void showElement(Element temp){
        for (Iterator it=temp.elementIterator("groupId");it.hasNext();)
        {
            Element result=(Element)it.next();
            if (result.elements().size()>0){
                System.out.println(result.getName());
                showElement(result);
            }
            else
            {
                System.out.println(result.getName()+"        "+result.getStringValue());
            }
        }
}

3.取得当前节点的指定名称的子节点

public void selectNode(String target){
        SAXReader saxReader = new SAXReader();
        File file = new File("H:\m.xml");
        Document document = null;
        try {
            document = saxReader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Element met=root.element(target);
        System.out.println(met.getText());

    }

4.利用selectNode以及selectNodes函数(对于有xmlns的需要特殊处理)

public void selectNode(String target){
 Map map = new HashMap();
 map.put("ns","http://maven.apache.org/POM/4.0.0");
 SAXReader saxReader = new SAXReader();
 File file = new File("H:\m.xml");
 saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
 Document document = null;
 try { document = saxReader.read(file); }
 catch (DocumentException e) { e.printStackTrace(); }
 List tmp = root.selectNodes("//ns:groupId");// 两个/指的是忽略当前节点位置在全文搜索,不加/则是当前节点的子节点中搜索,不再向深层搜索
 System.out.println(tmp.size()); 
}

对于有命名空间的xml文件,必须采用上面的方法,使用selectNodes和selectSingleNode方法才能找到对应的Element,如果没有xmlns这种命名空间,只需要简单的直接使用即可。

5.遍历属性

public void attributeShow(Element root){
   for (Iterator it=root.attributeIterator();it.hasNext();){
        Attribute attribute=(Attribute)it.next();    System.out.println(attribute.getName()+":"+attribute.getText());
   }
}

6.对于读取xml文件,上面介绍了几种常用方法,下面介绍一下写xml的方法。首先是修改

public void addElement(Document doc){
    Element root = doc.getRootElement();
    Element added=root.addElement("element1");
    added.setText("added value");
    added.addAttribute("type","test");
    for (Iterator it=root.attributeIterator();it.hasNext();){
        Attribute atr=(Attribute)it.next();
        atr.setName("change");
        atr.setValue("change value");
    }
}

上面的例子添加了root的子节点element1 并为这个节点添加了属性和值,修改了root的属性(将所有属性改成一样的了,别在意,只是个例子)

那么接下来就是将改动保存到文件当中了

public void writeToFile(Document document){
    try {
        FileWriter fw=new FileWriter(path);
        document.write(fw);
       fw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行完毕后打开文件就可以看到改动已经被写入了文件。

dom4j提供了一个非常方便的类 DocumentHelper 这个类有很多的静态方法供我们调用,很方便

public void showDocumentHelper(){
    Element root=document.getRootElement();
    DocumentHelper.createAttribute(root,"attr1","value1");
    Document newDoc=DocumentHelper.createDocument();
    Element newElement=DocumentHelper.createElement("newElement");
    XPath xPath=DocumentHelper.createXPath("path");
    List listEle=DocumentHelper.selectNodes("path",root);
}

还有将字符串转为xml以及xml转为字符串

Document document =DocumentHelper.parseText(str);
        String docStr=document.getStringValue();
        String docStr=documnet.asXML();

再来介绍一下XmlWriter,就是可以写出比较易读的xml 将filewriter包装

XMLWriter xw=new XMLWriter(new FileWriter(new File(path)));

免责声明:文章转载自《dom4j学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇深度解析C语言中的sizeof高通CP Crash分析调试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载

元素定位及其他操作 0、常见的识别元素的方法是什么? 1 driver.find_element_by_id() 2 driver.find_element_by_name() 3 driver.find_element_by_class_name() 4 driver.find_element_by_tag_name() 5 driver.find...

element ui Cascader 级联选择器 关闭tag时报错 :vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in callback for watcher "value": "TypeError: Cannot read property 'level' of null"

情况说明:多选后,点击关闭tag的按钮,会出现如下报错。   经过使用官网列子,及数据。发现删除tag并不会出现这个错误。经过对比,唯一不同的是官网的value 是字符串对象,而我使用的id是数字。将id改成字符串格式后,问题就解决了。 ☀ ░ 标记一下░  ☀...

JS DOM元素

// 为element增加一个样式名为newClassName的新样式 functionaddClass(element, newClassName) { var value =element.className; element.className = value + " " +newClassName; } var bo...

vue+element项目里实时监听某个div宽度的变化,然后执行相应的事件

背景:vue项目中用到echarts图表,页面上有侧边栏,侧边栏收缩图表不能自适应,想通过监听内容部分的宽度让图表resize,试过window带的resize,只能监听浏览器窗口大小变化,为了监听某元素区域的变化而使echarts的尺寸重置。可以看到收起时会图表不会发生变化(上面的折线图是已经调好的)解决方式----- 一、自定义指令的方式1、局部自定义...

Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装

因为我暂时不需要第五章和第六章教程的内容所以直接进入第七章。感兴趣的可以访问原作者网站 Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题  Vue + Element UI 实现权限管理系统 前端篇(五):国际化实现  注:本次封装的css样式应该有点问题,但考虑时间问题没有认真修改,后续有时间重构时候补上。 组件...

Java操作XML文件 dom4j 篇

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互。今天就来讲一下Java 中使用dom4j来操作XML文件。 我们需要引入的包: //文件包importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileWriter;//工具包importjava...