DOM解析之DOM4J

@author ixenos

DOM4J常用API


读取xml文档:

Document doc = new SAXReader().read("xml文件");

节点:

nodeIterator();  所有节点

标签:

element("名称")   指定名称的第一个子标签对象

elementIterator("名称");  指定名称的所有子标签对象

elements();  所有子标签对象

属性:

attributeValue(“名称”) 指定名称的属性值

attribute("名称")   指定名称的属性对象

getName()  属性名称

getValue()  属性值

atributeIterator()   所有属性对象(Iterator)

attributes()       所有属性对象(List)

文本:

getText()  得到当前标签的文本

elementText("子标签名称")  得到子标签的文本


SAXReader reader = new SAXReader();

//Document对象也看成根节点

Document doc = reader.read(File file);

//迭代当前节点下的子节点/也可foreach

Iterator itr = doc.nodeIterator();

While(itr.hasNext()){ Node node = itr.next(); }

//得到根节点

Element  rootElem = doc.getRootElement();

//得到当前标签下指定名称的第一个子标签

Element contactElem = rootElem.element("contact");

//得到当前标签下的的所有子标签

List<Element> list = rootElem.elements();

//获取更深层次的标签(方法只能一层层地获取),XPath!!!当然这只获得第一个

Element nameElem = doc.getRootElement().element("contact").element("name");

//得到指定名称的属性值

String idValue = contactElem.attributeValue("id");

//为标签添加属性和属性值。根据XML约定,若value为null,则attr属性不存在,这可用于删除属性

Element newElement = element.addAttribute(String attr, String value)

//得到指定属性名称的属性对象

Attribute idAttr = contactElem.attribute("id");

//得到所有属性对象,返回LIst集合

List<Attribute> list = contactElem.attributes();

//得到所有属性对象,返回迭代器

Iterator<Attribute> it = contactElem.attributeIterator();

while(it.hasNext()){ Attribute attr = it.next(); }

//得到当前标签夹着的的Text内容,注意空格和换行也是Text

String content = doc.getRootElement().getText();

//获取文本(先获取标签,再获取标签上的文本)

Element nameELem =doc.getRootElement().element("contact").element("name");

//然后得到文本

String text = nameELem.getText();

System.out.println(text);

//直接得到指定子标签名的文本内容,直接得到phone标签的Text

String text2 = doc.getRootElement().element("contact").elementText("phone");

1、最基本的:Document对象指代整个XML文件

// 读取XML文档,返回Document对象

SAXReader reader = new SAXReader();

// 读取xml文档,返回Document对象

Document doc = reader.read(new File("03.contact.xml"));

2、Document对象的nodeIterator方法迭代下一级,判断是否是Element对象,下一级再用nodeIterator迭代下一级,双重循环,或者用递归,就能遍历所有标签节点

// nodeiterator:得到当前标签节点下的所有子节点对象

Iterator<Node> it = doc.nodeIterator();

while (it.hasNext()) {

Node node = it.next();

String name = node.getName();

System.out.println(name);

// 继续取出下面的子节点

// 只有标签节点才有子节点

// 所以判断当前标签是否标签节点

if (node instanceof Element) {

Element elem = (Element) node;

Iterator<Node> it2 = elem.nodeIterator();

while (it2.hasNext()) {

Node node2 = it2.next();

System.out.println(node2.getName());

}

}

}

DOM4J完整读取XML内容示例


 import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* 练习-完整读取xml文档内容
* @author APPle
*
*/
public class Demo3 { @Test
public void test() throws Exception{
//读取xml文档
SAXReader reader = new SAXReader();
Document doc =
reader.read(new File("./src/contact.xml")); //读取根标签
Element rootELem = doc.getRootElement(); StringBuffer sb = new StringBuffer(); getChildNodes(rootELem,sb); System.out.println(sb.toString()); } /**
* 获取当前标签的所有子标签
*/
private void getChildNodes(Element elem,StringBuffer sb){
//System.out.println(elem.getName()); //开始标签
sb.append("<"+elem.getName()); //得到标签的属性列表
//为什么属性的组装放在循环体外呢?因为此时循环体是获得element根节点的子节点,所以不能组装根标签的属性,只能留待下面的递归配合迭代来曲线救国
List<Attribute> attrs = elem.attributes();
if(attrs!=null){
for (Attribute attr : attrs) {
//System.out.println(attr.getName()+"="+attr.getValue());
//属性值双引号使用转义字符
sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");
}
}
sb.append(">"); //得到文本
//String content = elem.getText();
//System.out.println(content);
Iterator<Node> it = elem.nodeIterator();
while(it.hasNext()){
Node node = it.next(); //标签
if(node instanceof Element){
Element el = (Element)node;
getChildNodes(el,sb);
} //文本
if(node instanceof Text){
Text text = (Text)node;
sb.append(text.getText());
}
} //结束标签
sb.append("</"+elem.getName()+">"); }
}

DOM4J用于封装XML中的对象时


package gz.itcast.a_dom4j_read;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /**
* 把xml文档信息封装到对象中
* @author APPle
*
*/
public class Demo4 { public static void main(String[] args) throws Exception{
List<Contact> list = new ArrayList<Contact>(); //读取xml,封装对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
//读取contact标签
Iterator<Element> it = doc.getRootElement().elementIterator("contact");
while(it.hasNext()){
Element elem = it.next();
//创建Contact
Contact contact = new Contact();
contact.setId(elem.attributeValue("id"));
contact.setName(elem.elementText("name"));
contact.setAge(elem.elementText("age"));
contact.setPhone(elem.elementText("phone"));
contact.setEmail(elem.elementText("email"));
contact.setQq(elem.elementText("qq"));
list.add(contact);
} for (Contact contact : list) {
System.out.println(contact);
} }
}

  

JavaEE XML DOM解析之DOM4J的更多相关文章

  1. JavaEE XML DOM解析

    DOM解析XML @author ixenos XML解析方式(原理) a)     DOM 解析树 b)     SAX  流事件 DOM解析对应主流工具 i.          DOM(官方) i ...

  2. JavaEE XML DOM创建之DOM4J

    DOM4J创建xml文档 @author ixenos 1 写出内容到xml文档 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt ...

  3. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  4. Java XML Dom解析工具

    Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...

  5. XML与web开发-01- 在页面显示和 XML DOM 解析

    前言: 关于 xml 特点和基础知识,可以菜鸟教程进行学习:http://www.runoob.com/xml/xml-tutorial.html 本系列笔记,主要介绍 xml 在 web 开发时需要 ...

  6. Java XML DOM解析(xPath)

    (一) XML概念 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的 ...

  7. XML文件解析之DOM4J解析

    1.DOM4J介绍 dom4j的官网是http://www.dom4j.org/dom4j-1.6.1/,最新的版本是1.6.1,根据官网介绍可知.dom4j是一个易用的.开源的库,应用于Java平台 ...

  8. JavaEE XML DOM创建

    DOM创建XML @author ixenos 1.思路: 先封装构建一颗DOM树,然后将DOM树转换成XML文件 2.三种写DOM树到XML文件的方式: 1)使用DOM(或DOM4J.JDOM) 2 ...

  9. Python使用xml.dom解析xml

    在菜鸟教程上找了个关于电影信息的xml类型的文档,用python内置的xml.dom来解析提取一下信息. 先复习一下xml概念: XML 指可扩展标记语言(EXtensible Markup Lang ...

随机推荐

  1. 题目要求:建立一个类Str,将一个正整数转换成相应的字符串,例如整数3456转换为字符串"3456".

    题目要求:建立一个类Str,将一个正整数转换成相应的字符串,例如整数3456转换为字符串"3456". 关键:怎么将一个数字转换为字符? [cpp] view plaincopy ...

  2. Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题

    细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!   在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找 ...

  3. Ajax运用总结B

    Jquery重新学习之八[Ajax运用总结B]   上一篇简单介绍普通javascript以及Jquery的AJAX方法,其中Jquery.ajax()是功能比较强悍的底层方法,可以更多地关注实现过程 ...

  4. C#中几个经常犯的错误总汇

    在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错 ...

  5. .NET:线程本地存储、调用上下文、逻辑调用上下文

    .NET:线程本地存储.调用上下文.逻辑调用上下文 目录 背景线程本地存储调用上下文逻辑调用上下文备注 背景返回目录 在多线程环境,如果需要将实例的生命周期控制在某个操作的执行期间,该如何设计?经典的 ...

  6. C++中内存泄露的检测

    C++没有java的内存垃圾回收机制,在程序短的时候可能比较容易发现问题,在程序长的时候是否有什么检测的方法呢? 假设有一个函数可以某点检测程序的内存使用情况,那是否可以在程序开始的时候设置一个点,在 ...

  7. 译文:User-agent的历史

      这是一篇译文,译文出处在文章底部贴出.由于技术水平,英语水平,翻译水平有限,请各路大侠多多指正,谢谢,提高你也提高我:)   几个礼拜之前,我谈论了特征检测和浏览器检测.这篇帖子提到了一点点嗅探U ...

  8. opencv中的vs框架中的Blob Tracking Tests的中文注释。

    经过2天的努力终于算是大概弄清楚了opencv中的vs框架是大概是如何工作的了,下面贴一下我自己写的代码注释.非常详细.对初学者有帮助.尤其详细分析了RunBlobTrackingAuto()函数,在 ...

  9. Http Module 介绍(转载)

    Http Module 介绍 引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IH ...

  10. java开发是否一定要使用三层结构

    从开始学习java的时候,爷爷的爷爷就教导我们,要使用三层结构去开发结构明细,低耦合,高可用的项目.但是具体开发中,每新建一张表,就要新建BO,dao层,服务层,而新建这5,6个类也许仅仅只为了实现一 ...