我所理解的dom4j就是用来解析XML文档的,XML文档的重要性不言而喻,用过框架的人谁不知道呢,是不是。但是实际上需要我们自己来解析XML文档的应用场景感觉不是很多,毕竟该解析的XML都已经被框架很好的解析了,你在自己搞一遍不是吃饱了撑的么?但是,有时候还真是需要撑一下,如果你想自己来写框架的话,XML的解析就十分重要了。另外一点是,掌握XML解析对后面框架的学习也有一定的好处,不是么?

废话不多说,直接上代码。

解析XML

 // 解析XML
public Document parse(String path) throws DocumentException { SAXReader reader = new SAXReader(); // 新建一个SAXReader对象
Document document = reader.read(path); // read()方法有有很多重载的方法,为的是读取不同来源的XML
return document; // 返回解析的XML对象,以DOM树的形式
}

使用迭代器

 // 使用迭代器
public void bar(Document document) { Element root = document.getRootElement(); // 由DOM树的对象document获得根元素 // 迭代遍历根节点root的子元素
for (Iterator<Element> i = root.elementIterator(); i.hasNext();) {
Element element = i.next();
} // 迭代遍历根节点root名字为"foo"的子元素
// 根据名字获得迭代器
for(Iterator<Element> i = root.elementIterator("foo"); i.hasNext();) {
Element foo = i.next();
// do something
}
}

使用XPath进行导航

 // 使用XPath进行导航
public void bar1(Document document) {
List list = document.selectNodes("//foo/bar"); // selectNodes获得结点都保存在List当中 Node node = document.selectSingleNode("//foo/bar/author"); // 获取单个结点
String name = node.valueOf("@name"); // 获得结点name的属性值 List list2 = document.selectNodes("//a/@href"); // 选取所有超链接的href属性值 // 遍历这个属性
for (Iterator iter = list.iterator(); iter.hasNext();) { Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}

快速地遍历

如果想要快速地遍历一个比较大的XML文档树,用下面的方法可以减少迭代器的创建。

 // 下面的这个递归还挺别致的
public void treeWalk(Document document) { treeWalk(document.getRootElement()); // 这个尼玛看起来像递归,其实根本不是
} public void treeWalk(Element element) { for(int i=0, size=element.nodeCount(); i<size; i++) { Node node = element.node(i);
if(node instanceof Element) {
treeWalk((Element) node); // 这里才是递归
}
else {
// do something......
}
}
}

创建一个新的XML文档

 public Document createDocument() {
Document document = DocumentHelper.createDocument(); // 先返回一个document对象再说
Element root = document.addElement("root"); // 添加根元素 Element author1 = root.addElement("author")
.addAttribute("name", "James") // 添加属性name
.addAttribute("location", "UK") // 添加属性location
.addText("James Strachan"); // 添加标签里面的文本
return document;
}

将XML文档写入到文件中

一个快速和简单的方法将一个Doument对象或者Node对象写入到文件中是通过write()方法

 FileWriter out = new FileWriter("foo.xml");
Document.write(out);

字符串和XML的相互转化

 // XML转为字符串
Document document = new SAXReader().read("foo.xml");
String text = document.asXML(); // 字符串转为XML
String text2 = "<person><name>James</name></person>";
Document document2 = DocumentHelper.parseText(text2);

dom4j的quickstart的更多相关文章

  1. java学习笔记DOM4J解析(7)

    DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型. DOM4J是开源组织提供的一个免费的.强大的XML解析工具,如果开发者需要在项 ...

  2. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  3. 四种解析和创建方式(DOM,SAX,DOM4J,JDOM)

    一.先导入jar包 DOM基于树形,SAX基于事件,DOM4J和JDOM基于底层API 二.代码如下 1 package com.sxt.test; import java.io.File; impo ...

  4. dom4j的小例子

    1.要解析的xml文件book.xml <?xml version="1.0" encoding="UTF-8"?> <books> & ...

  5. Dom4J解析技术

    前面的话  本文主要讲解有关Dom4j技术和xpath配合下的优化!   目录:    为什么需要Dom4J    DOM4J怎么用    xpath怎么配合DOM4J 一  为什么需要Dom4J 一 ...

  6. Dom4j解析xml文件

    dom4j是一个Java的XML API,类似于jdom,用来读取的XML文件,由于它是将文件解析完存放在内存当中的,所以不适合解析大的XML文件,但就方便性和性能方面,一定程度要优于JDK中Domc ...

  7. java dom4j封装和解析XML

    package org.scbit.lsbi.scp.utils; import java.util.ArrayList; import java.util.List; import org.dom4 ...

  8. xml之dom4j解析

    * 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...

  9. 使用dom4j读取xml连接数据库与之单例模式

    使用dom4j读取xml ,加入jar包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar public class XmlConfigReader { //懒汉式,延迟加载 ...

随机推荐

  1. delphi 环境问题

    这个编译时的警告该如何理解?[Warning] Unit 'Unit101' implicitly imported into package 'Package202'------解决方案------ ...

  2. Python模块和包

    模块和包是python组织代码的基本方式. 模块: python的每一个脚本文件都可称之为模块,模块的名称就是脚本的文件名.例如当我们写了一个test.py的脚本文件,则可以在同目录下的另外一个脚本m ...

  3. js的一些实用的小技巧

    1.移动端自适应: 移动端的编写首先需要在header写入以下内容来表示页面是以不缩放的形式展示的: <meta name="viewport" content=" ...

  4. postgresql修炼之道学习笔记(1)

    好好学习吧. 本笔记 仅作为摘要记录 前两章,主要是数据库对比和安装等. 对比,就比多说了,总是和别人比较,会显得自己身价低,呵呵. 安装也有很多文章,不多说. 第二章提到了一些简单的配置, 其在 d ...

  5. 界面使用webview,并且webview里面有图片进行自动切换导致界面上滚动条卡顿。

    最近的项目是用webview做的界面,但是在界面顶端加了android本地动画效果的横向滚动条.当webview里面的图片切换时导致滚动条动画卡顿. 1:setLayerType(View.LAYER ...

  6. 写了placement new就要写placement delete

    "placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的 ...

  7. sql 默认id为1000

    创建索引: alter table resource AUTO_INCREMENT=1000;  //id默认自增为1000:

  8. Notepad++自动刷新文本

    现在的日志信息往往都是打印在硬盘上,而不是保存到线上,所以我们常常会使用notepad++来查看硬盘上的文本文件 这时往往会出现两个问题 (1)在notepad++长时间最小化后,再次打开会提示是否下 ...

  9. Adressing

  10. python与ruby的差别

    1.引用文件差别 Ruby:同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件.如果直接在foo.rb中 require 'bar' ...