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


 

 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 
83 
84     }
85 }

 

 

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);
			}


		}
}

  

 

posted @ 2017-01-12 22:44  ixenos  阅读(560)  评论(1编辑  收藏  举报