XML系列:(6)XML解析-Dom4j的DOM解析方式读取XML

Dom4j工具,是非官方的,不在jdk中。

使用步骤:

1)导入dom4j的核心包。 dom4j-1.6.1.jar

2)编写Dom4j读取xml文件的代码


animals.xml

<?xml version="1.0" encoding="UTF-8"?>
<Animals>
	<Cat id="c001" name="喵喵">
		<Home>火星</Home>
		<BornDate>2010-01-01</BornDate>
	</Cat>
	<Cat id="c002" name="咪咪">
		<Home>冥王星</Home>
		<BornDate>2012-09-01</BornDate>
	</Cat>
	<Cat id="c003" name="Tom">
		<Home>地球</Home>
		<BornDate>2011-12-23</BornDate>
	</Cat>
	<Dog id="d001" name="旺财">
		<Home>木星</Home>
		<BornDate>2007-10-16</BornDate>
	</Dog>
	<Dog id="d002" name="汪汪">
		<Home>金星</Home>
		<BornDate>2008-05-12</BornDate>
	</Dog>
</Animals>


1、读取XML


1.1、获取Document对象

package com.rk.xml.f_dom4j_read;

import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

/**
 * 第一个Dom4j读取xml文档的例子
 * 获得Document对象
 * @author RK
 */
public class Demo01
{
	public static void main(String[] args)
	{
		try
		{
			//1.创建一个xml解析器对象
			SAXReader reader = new SAXReader();
			//2.读取xml文档,返回Document对象
			Document doc = reader.read(new File("./src/animals.xml"));
			System.out.println(doc);
		}
		catch (DocumentException e)
		{
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}


1.2、读取xml文件内容:节点、标签、属性、文本

package com.rk.xml.f_dom4j_read;

import java.util.List;
import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Attribute;
import org.dom4j.io.SAXReader;
import org.junit.Test;

/**
 * 第二个dom4j读取xml文件内容
 * 节点
 * 标签
 * 属性
 * 文本
 * @author RK
 *
 */
public class Demo02
{
	/**
	 * 获取节点
	 * 1、通过Document文档获得根元素Document.getRootElement()
	 * 2、获得标签元素下的所有子节点 Branch.nodeIterator()
	 * 3、获得节点的名字、类型:Node.getName(), Node.getNodeType(), Node.getNodeTypeName()
	 */
	@Test
	public void testNode()
	{
		try
		{
			//1.读取xml文档,返回Document对象
			SAXReader reader = new SAXReader();
			Document doc = reader.read(new File("./src/products.xml"));
			//2、得到根标签
			Element rootElement = doc.getRootElement();
			//3、遍历文档的所有节点
			getChildNodes(rootElement);
		}
		catch (DocumentException e)
		{
			e.printStackTrace();
		}
	}
	
	private void getChildNodes(Element elem)
	{
		//nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
		@SuppressWarnings("unchecked")
		Iterator<Node> it = elem.nodeIterator();		
		
		while(it.hasNext())
		{
			Node node = it.next();
			System.out.println(node.getName() + "===" + node.getNodeType() + "===" + node.getNodeTypeName());
			//判断是否是标签元素
			if(node instanceof Element)
			{
				getChildNodes((Element)node);
			}
		}
	}
	
	/**
	 * 获取标签
	 * 1、获取特定的一个标签 Element.element(String name) : 得到当前标签下指定名称的第一个子标签
	 * 2、获取所有的子标签 Element.elementIterator(String name):  得到当前标签下指定名称的所有子标签
	 */
	@Test
	public void testElement() throws Exception
	{
		//1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/animals.xml"));
		
		//2.得到根标签
		System.out.println("===================================2");
		Element rootElement = doc.getRootElement();
		//获得节点相关信息
		String name = rootElement.getName();//得到节点名称
		short type = rootElement.getNodeType();//得到节点类型
		String typeName = rootElement.getNodeTypeName();//得到节点类型名称
		System.out.println(name + "\t" + type + "\t" + typeName);
		
		//3.得到当前标签下指定名称的第一个子标签
		System.out.println("===================================3");
		Element productElement = rootElement.element("Dog");
		System.out.println(productElement.getName());
		
		//4.得到当前标签下指定名称的所有子标签
		System.out.println("===================================4");
		@SuppressWarnings("unchecked")
		Iterator<Element> it =  rootElement.elementIterator("Cat");
		while(it.hasNext())
		{
			Element elem = it.next();
			System.out.println(elem.getName());
		}
		
		//5.得到当前标签下的的所有子标签
		System.out.println("===================================5");
		@SuppressWarnings("unchecked")
		List<Element> list = rootElement.elements();
		//遍历List的方法
		//1)传统for循环  2)增强for循环 3)迭代器
//		for(int i=0;i<list.size();i++)
//		{
//			System.out.println(list.get(i).getName());
//		}
//		for(Element elem : list)
//		{
//			System.out.println(elem.getName());
//		}
		Iterator<Element> iterator = list.iterator();
		while(iterator.hasNext())
		{
			Element elem = iterator.next();
			System.out.println(elem.getName());
		}
		
		//6、获取更深层次的标签(方法只能一层层地获取)
		System.out.println("===================================6");
		Element nameElement = rootElement.element("Dog").element("Home");
		System.out.println(nameElement.getName());
		System.out.println(nameElement.getText());
		System.out.println(nameElement.getPath());
		System.out.println(nameElement.getUniquePath());
	}

	/**
	 * 获取属性
	 * 1、获取特定的一个属性
	 * 2、获取标签元素下的所有属性
	 */
	@Test
	public void testAttribute() throws Exception
	{
		//读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/animals.xml"));
		Element rootElement = doc.getRootElement();
		
		//获取属性:(先获的属性所在的标签对象,然后才能获取属性)
		//1.得到标签对象
		Element dogElement = rootElement.element("Dog");
		//2.得到属性
		//2.1  得到指定名称的属性值
		System.out.println("===================================2.1");
		String idValue = dogElement.attributeValue("id");
		System.out.println(idValue);
		
		//2.2 得到指定属性名称的属性对象
		System.out.println("===================================2.2");
		Attribute idAttr = dogElement.attribute("name");
		//getName: 属性名称    getValue:属性值
		System.out.println(idAttr.getName() + "=" + idAttr.getValue());
		
		//2.3 得到所有属性对象,返回List集合
		System.out.println("===================================2.3");
		@SuppressWarnings("unchecked")
		List<Attribute> list = dogElement.attributes();
		//遍历属性
		for(Attribute attr : list)
		{
			System.out.println(attr.getName() + "=" + attr.getValue());
		}
		
		//2.4 得到所有属性对象,返回迭代器
		System.out.println("===================================2.4");
		@SuppressWarnings("unchecked")
		Iterator<Attribute> iterator = rootElement.element("Cat").attributeIterator();
		while(iterator.hasNext())
		{
			Attribute attr = iterator.next();
			System.out.println(attr.getName() + "=" + attr.getValue());
		}
	}

	/**
	 * 获取文本
	 * 1、获取当前标签元素的文本Element.getText()
	 * 2、获取子标签元素的文本Element.elementText(String name)
	 */
	@Test
	public void testText() throws Exception
	{
		//读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/animals.xml"));
		
		Element rootElement = doc.getRootElement();
		
		//注意: 空格和换行也是xml的内容
		String content = rootElement.getText();
		System.out.println("==Start==" + content + "==End==");
		
		//获取文本(先获取标签,再获取标签上的文本)
		Element bornDateElement = rootElement.element("Cat").element("BornDate");
		//1. 得到文本
		String text = bornDateElement.getText();
		System.out.println(bornDateElement.getName() + "元素的文本是" + text);
		
		//2. 得到指定子标签名的文本内容
		String text2 = rootElement.element("Dog").elementText("Home");
		System.out.println(text2);
	}
}



1.3、练习-完整读取xml文档内容

package com.rk.xml.f_dom4j_read;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.Element;
import org.dom4j.Attribute;
import org.dom4j.io.SAXReader;

/**
 * 练习-完整读取xml文档内容
 * @author RK
 *
 */
public class Demo03
{
	public static void main(String[] args) throws Exception
	{
		//读取xml文档
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/animals.xml"));
		
		//读取根标签
		Element rootElement = doc.getRootElement();
		StringBuilder sb = new StringBuilder();
		
		getChildNodes(rootElement,sb);
		
		System.out.println(sb.toString());
	}

	/**
	 * 获取当前标签的所有子节点
	 */
	private static void getChildNodes(Element currentElement, StringBuilder sb)
	{
		String name = currentElement.getName();
		//开始标签Start
		sb.append("<"+name);
		//得到标签的属性列表
		@SuppressWarnings("unchecked")
		Iterator<Attribute> iterator = currentElement.attributeIterator();
		while(iterator.hasNext())
		{
			Attribute attr = iterator.next();
			String attrName = attr.getName();
			String attrValue = attr.getValue();
			sb.append(" " + attrName + "=\"" + attrValue + "\"");
		}
		//开始标签End
		sb.append(">");
		
		//获取子节点
		@SuppressWarnings("unchecked")
		Iterator<Node> it = currentElement.nodeIterator();
		while(it.hasNext())
		{
			Node node = it.next();
			short type = node.getNodeType();
			if(type == Node.ELEMENT_NODE)
			{
				getChildNodes((Element)node, sb);
			}
			else if(type == Node.TEXT_NODE)
			{
				sb.append(node.getText());
			}
			else
			{
				//其它情况,不做处理
			}
		}
		
		//结束标签
		sb.append("</" + name + ">");
		
	}
}




2、思维导图

XML系列:(6)XML解析-Dom4j的DOM解析方式读取XML_第1张图片





你可能感兴趣的:(xml,dom4j)