JavaEE XML DOM解析之DOM4J
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的更多相关文章
- JavaEE XML DOM解析
DOM解析XML @author ixenos XML解析方式(原理) a) DOM 解析树 b) SAX 流事件 DOM解析对应主流工具 i. DOM(官方) i ...
- JavaEE XML DOM创建之DOM4J
DOM4J创建xml文档 @author ixenos 1 写出内容到xml文档 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- Java XML Dom解析工具
Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...
- XML与web开发-01- 在页面显示和 XML DOM 解析
前言: 关于 xml 特点和基础知识,可以菜鸟教程进行学习:http://www.runoob.com/xml/xml-tutorial.html 本系列笔记,主要介绍 xml 在 web 开发时需要 ...
- Java XML DOM解析(xPath)
(一) XML概念 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的 ...
- XML文件解析之DOM4J解析
1.DOM4J介绍 dom4j的官网是http://www.dom4j.org/dom4j-1.6.1/,最新的版本是1.6.1,根据官网介绍可知.dom4j是一个易用的.开源的库,应用于Java平台 ...
- JavaEE XML DOM创建
DOM创建XML @author ixenos 1.思路: 先封装构建一颗DOM树,然后将DOM树转换成XML文件 2.三种写DOM树到XML文件的方式: 1)使用DOM(或DOM4J.JDOM) 2 ...
- Python使用xml.dom解析xml
在菜鸟教程上找了个关于电影信息的xml类型的文档,用python内置的xml.dom来解析提取一下信息. 先复习一下xml概念: XML 指可扩展标记语言(EXtensible Markup Lang ...
随机推荐
- 深入理解javascript new的机制
我们在使用对象的时候,除了一些浏览器内置的单体对象可以直接使用外,都会new一个出来使用. 1.最简单的莫过于如下获取一个Object对象实例 var obj = new Object(); 说明:此 ...
- 动态生成WebService的客户端
给定了WebService地址和调用接口后动态的生成DLL,第二次再请求时会先判断DLL是否存在,以提高执行效率 核心代码下: /// <summary> /// 动态生成WebServi ...
- iOS基础 - Quartz 2D绘图
一.Quartz 2D Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境. Quartz 2D以PDF的规范为基础的图形库,用来绘制二维文字和图形,允许相同的绘图指令在任 ...
- 创建FTP的Site并用C#进行文件的上传下载
创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...
- const 还是 static readonly
到底是 const 还是 static readonly 真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试 ...
- 一个Shell小脚本——旋转的斜杠
话不多说,请从代码中寻找乐趣吧! #!/bin/bash #----中断计数器----# incr= #----旋转的斜杠----# spin="/-\|" echo -en &q ...
- 长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)
问题: 长度为n的数组,有一个数重复出现了n/2+1次,找出这个数: 解决: 比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止: #inc ...
- 程序处理数据库中值字段值为null的查询显示
1.如果你做了一个简单的注册界面,需要用户进行注册,但有些项是不必要填的,当用户完成注册时,数据库表中的相应字段的值会写入null,但如何将查询的字段的值null显示出来? 2.首先我们学习一下如何向 ...
- jQuery中bind与live的用法与区别
首先介绍这两个方法之前,我们常用的是click()方法 $("a").click(function() { alert("hello"); }); click( ...
- [原创*精华]一键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来...
重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一个word文档,word文档就是本 ...