您的位置:首页 > 其它

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

2016-05-14 03:10 465 查看
Dom4j工具,是非官方的,不在jdk中。使用步骤:1)导入dom4j的核心包。 dom4j-1.6.1.jar2)编写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、思维导图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dom4j xml