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内容示例


  1. import java.io.File;
  2. import java.util.Iterator;
  3. import java.util.List;
  4.  
  5. import org.dom4j.Attribute;
  6. import org.dom4j.Document;
  7. import org.dom4j.Element;
  8. import org.dom4j.Node;
  9. import org.dom4j.Text;
  10. import org.dom4j.io.SAXReader;
  11. import org.junit.Test;
  12. /**
  13. * 练习-完整读取xml文档内容
  14. * @author APPle
  15. *
  16. */
  17. public class Demo3 {
  18.  
  19. @Test
  20. public void test() throws Exception{
  21. //读取xml文档
  22. SAXReader reader = new SAXReader();
  23. Document doc =
  24. reader.read(new File("./src/contact.xml"));
  25.  
  26. //读取根标签
  27. Element rootELem = doc.getRootElement();
  28.  
  29. StringBuffer sb = new StringBuffer();
  30.  
  31. getChildNodes(rootELem,sb);
  32.  
  33. System.out.println(sb.toString());
  34.  
  35. }
  36.  
  37. /**
  38. * 获取当前标签的所有子标签
  39. */
  40. private void getChildNodes(Element elem,StringBuffer sb){
  41. //System.out.println(elem.getName());
  42.  
  43. //开始标签
  44. sb.append("<"+elem.getName());
  45.  
  46. //得到标签的属性列表
  47. //为什么属性的组装放在循环体外呢?因为此时循环体是获得element根节点的子节点,所以不能组装根标签的属性,只能留待下面的递归配合迭代来曲线救国
  48. List<Attribute> attrs = elem.attributes();
  49. if(attrs!=null){
  50. for (Attribute attr : attrs) {
  51. //System.out.println(attr.getName()+"="+attr.getValue());
  52. //属性值双引号使用转义字符
  53. sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");
  54. }
  55. }
  56. sb.append(">");
  57.  
  58. //得到文本
  59. //String content = elem.getText();
  60. //System.out.println(content);
  61. Iterator<Node> it = elem.nodeIterator();
  62. while(it.hasNext()){
  63. Node node = it.next();
  64.  
  65. //标签
  66. if(node instanceof Element){
  67. Element el = (Element)node;
  68. getChildNodes(el,sb);
  69. }
  70.  
  71. //文本
  72. if(node instanceof Text){
  73. Text text = (Text)node;
  74. sb.append(text.getText());
  75. }
  76. }
  77.  
  78. //结束标签
  79. sb.append("</"+elem.getName()+">");
  80.  
  81. }
  82. }

DOM4J用于封装XML中的对象时


  1. package gz.itcast.a_dom4j_read;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. import java.util.Iterator;
  6. import java.util.List;
  7.  
  8. import org.dom4j.Document;
  9. import org.dom4j.Element;
  10. import org.dom4j.io.SAXReader;
  11.  
  12. /**
  13. * 把xml文档信息封装到对象中
  14. * @author APPle
  15. *
  16. */
  17. public class Demo4 {
  18.  
  19. public static void main(String[] args) throws Exception{
  20. List<Contact> list = new ArrayList<Contact>();
  21.  
  22. //读取xml,封装对象
  23. SAXReader reader = new SAXReader();
  24. Document doc = reader.read(new File("./src/contact.xml"));
  25. //读取contact标签
  26. Iterator<Element> it = doc.getRootElement().elementIterator("contact");
  27. while(it.hasNext()){
  28. Element elem = it.next();
  29. //创建Contact
  30. Contact contact = new Contact();
  31. contact.setId(elem.attributeValue("id"));
  32. contact.setName(elem.elementText("name"));
  33. contact.setAge(elem.elementText("age"));
  34. contact.setPhone(elem.elementText("phone"));
  35. contact.setEmail(elem.elementText("email"));
  36. contact.setQq(elem.elementText("qq"));
  37. list.add(contact);
  38. }
  39.  
  40. for (Contact contact : list) {
  41. System.out.println(contact);
  42. }
  43.  
  44. }
  45. }

  

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. VS2013 Update 2正式发布 .NET Framework“云优先、移动优先”

    2013 Update 2正式发布 .NET Framework“云优先.移动优先” 投递人 itwriter 发布于 2014-05-13 12:33 评论(19) 有2155人阅读  原文链接   ...

  2. 博客加上“Fork me on Github”彩带

    给你的博客加上“Fork me on Github”彩带 起 如今,随着Git的大热以及Github的优越性,许多知名开源项目都将源代码托管到Github上了.在Github上不仅可以托管自己的开源项 ...

  3. 朴素贝页斯分类法 c++实现

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.对于搞机器学习的同学们来说,这是相对简单但效果较好的模型. 朴素贝叶斯方法的理论 设输入为n维特征向量X={x1,x2,...,xn},输出为 ...

  4. W3C的CORS Specification

    W3C的CORS Specification 随着Web开放的程度越来越高,通过浏览器跨域获取资源的需求已经变得非常普遍.在我看来,如果Web API不能针对浏览器提供跨域资源共享的能力,它甚至就不应 ...

  5. .Net Attribute详解(一)

    .Net Attribute详解(一) 2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑 Attribute的直接翻译是属性,这和Property ...

  6. jQuery的入门与简介

    jQuery的入门与简介<思维导图>   <初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我 ...

  7. DevExpress 学习使用之 SplitContainerControl

    无论是 .net framework 自带还是第三方组件,使用 Split 类控件时通常其 Panel 中都会包含多个子控件,在运行时不可避免遇到因改变 splitter 位置或改变窗体大小引起的界面 ...

  8. asp.net做的网站账号登陆后注销不管用了

    最近做了个项目用到了数据库登录,A登陆后把登录状态保,个人信息存在Session里,但是奇怪的是,只要有一个用户登录后在其他电脑上打开上述页面,则也显示A登录状态,注销也不管用了.以前还号的.求大神啊 ...

  9. VC++实现小托盘的处理

    // 实验一Dlg.cpp : implementation file // #include "stdafx.h" #include "实验一.h" #inc ...

  10. eclipse调试java调用matlab程序的7.17dll找不到的问题

    经过多次查找,这个问题本来很简单,在环境变量中CLASSPATH配置C:\MATLAB\R2012a\toolbox\javabuilder\jar\win64\javabuilder.jar 特别注 ...