微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

使用步骤:

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

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


animals.xml

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


1、读取XML


1.1、获取Document对象

packagecom.rk.xml.f_dom4j_read;

importjava.io.File;
importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.io.SAXReader;

/**
*第一个Dom4j读取xml文档的例子
*获得Document对象
*@authorRK
*/
publicclassDemo01
{
	publicstaticvoidmain(String[]args)
	{
		try
		{
			//1.创建一个xml解析器对象
			SAXReaderreader=newSAXReader();
			//2.读取xml文档,返回Document对象
			Documentdoc=reader.read(newFile("./src/animals.xml"));
			System.out.println(doc);
		}
		catch(DocumentExceptione)
		{
			e.printstacktrace();
			thrownewRuntimeException(e);
		}
	}
}


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

packagecom.rk.xml.f_dom4j_read;

importjava.util.List;
importjava.io.File;
importjava.util.Iterator;

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

/**
*第二个dom4j读取xml文件内容
*节点
*标签
*属性
*文本
*@authorRK
*
*/
publicclassDemo02
{
	/**
	*获取节点
	*1、通过Document文档获得根元素Document.getRootElement()
	*2、获得标签元素下的所有子节点Branch.nodeIterator()
	*3、获得节点的名字、类型:Node.getName(),Node.getNodeType(),Node.getNodeTypeName()
	*/
	@Test
	publicvoidtestNode()
	{
		try
		{
			//1.读取xml文档,返回Document对象
			SAXReaderreader=newSAXReader();
			Documentdoc=reader.read(newFile("./src/products.xml"));
			//2、得到根标签
			ElementrootElement=doc.getRootElement();
			//3、遍历文档的所有节点
			getChildNodes(rootElement);
		}
		catch(DocumentExceptione)
		{
			e.printstacktrace();
		}
	}
	
	privatevoidgetChildNodes(Elementelem)
	{
		//nodeIterator:得到当前节点下的所有子节点对象(不包含孙以下的节点)
		@SuppressWarnings("unchecked")
		Iterator<Node>it=elem.nodeIterator();		
		
		while(it.hasNext())
		{
			Nodenode=it.next();
			System.out.println(node.getName()+"==="+node.getNodeType()+"==="+node.getNodeTypeName());
			//判断是否是标签元素
			if(nodeinstanceofElement)
			{
				getChildNodes((Element)node);
			}
		}
	}
	
	/**
	*获取标签
	*1、获取特定的一个标签Element.element(Stringname):得到当前标签下指定名称的第一个标签
	*2、获取所有的子标签Element.elementIterator(Stringname):得到当前标签下指定名称的所有子标签
	*/
	@Test
	publicvoidtestElement()throwsException
	{
		//1.读取xml文档,返回Document对象
		SAXReaderreader=newSAXReader();
		Documentdoc=reader.read(newFile("./src/animals.xml"));
		
		//2.得到根标签
		System.out.println("===================================2");
		ElementrootElement=doc.getRootElement();
		//获得节点相关信息
		Stringname=rootElement.getName();//得到节点名称
		shorttype=rootElement.getNodeType();//得到节点类型
		StringtypeName=rootElement.getNodeTypeName();//得到节点类型名称
		System.out.println(name+"\t"+type+"\t"+typeName);
		
		//3.得到当前标签下指定名称的第一个标签
		System.out.println("===================================3");
		ElementproductElement=rootElement.element("Dog");
		System.out.println(productElement.getName());
		
		//4.得到当前标签下指定名称的所有子标签
		System.out.println("===================================4");
		@SuppressWarnings("unchecked")
		Iterator<Element>it=rootElement.elementIterator("Cat");
		while(it.hasNext())
		{
			Elementelem=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(inti=0;i<list.size();i++)
//		{
//			System.out.println(list.get(i).getName());
//		}
//		for(Elementelem:list)
//		{
//			System.out.println(elem.getName());
//		}
		Iterator<Element>iterator=list.iterator();
		while(iterator.hasNext())
		{
			Elementelem=iterator.next();
			System.out.println(elem.getName());
		}
		
		//6、获取更深层次的标签(方法只能一层层地获取)
		System.out.println("===================================6");
		ElementnameElement=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
	publicvoidtestAttribute()throwsException
	{
		//读取xml文档,返回Document对象
		SAXReaderreader=newSAXReader();
		Documentdoc=reader.read(newFile("./src/animals.xml"));
		ElementrootElement=doc.getRootElement();
		
		//获取属性:(先获的属性所在的标签对象,然后才能获取属性)
		//1.得到标签对象
		ElementdogElement=rootElement.element("Dog");
		//2.得到属性
		//2.1得到指定名称属性值
		System.out.println("===================================2.1");
		StringidValue=dogElement.attributeValue("id");
		System.out.println(idValue);
		
		//2.2得到指定属性名称属性对象
		System.out.println("===================================2.2");
		AttributeidAttr=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(Attributeattr: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())
		{
			Attributeattr=iterator.next();
			System.out.println(attr.getName()+"="+attr.getValue());
		}
	}

	/**
	*获取文本
	*1、获取当前标签元素的文本Element.getText()
	*2、获取标签元素的文本Element.elementText(Stringname)
	*/
	@Test
	publicvoidtestText()throwsException
	{
		//读取xml文档,返回Document对象
		SAXReaderreader=newSAXReader();
		Documentdoc=reader.read(newFile("./src/animals.xml"));
		
		ElementrootElement=doc.getRootElement();
		
		//注意:空格和换行也是xml的内容
		Stringcontent=rootElement.getText();
		System.out.println("==Start=="+content+"==End==");
		
		//获取文本(先获取标签,再获取标签上的文本)
		ElementbornDateElement=rootElement.element("Cat").element("BornDate");
		//1.得到文本
		Stringtext=bornDateElement.getText();
		System.out.println(bornDateElement.getName()+"元素的文本是"+text);
		
		//2.得到指定子标签名的文本内容
		Stringtext2=rootElement.element("Dog").elementText("Home");
		System.out.println(text2);
	}
}



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

packagecom.rk.xml.f_dom4j_read;

importjava.io.File;
importjava.util.Iterator;

importorg.dom4j.Document;
importorg.dom4j.Node;
importorg.dom4j.Element;
importorg.dom4j.Attribute;
importorg.dom4j.io.SAXReader;

/**
*练习-完整读取xml文档内容
*@authorRK
*
*/
publicclassDemo03
{
	publicstaticvoidmain(String[]args)throwsException
	{
		//读取xml文档
		SAXReaderreader=newSAXReader();
		Documentdoc=reader.read(newFile("./src/animals.xml"));
		
		//读取根标签
		ElementrootElement=doc.getRootElement();
		StringBuildersb=newStringBuilder();
		
		getChildNodes(rootElement,sb);
		
		System.out.println(sb.toString());
	}

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




2、思维导图

wKioL1c2J2mQaTfAAAHmv1_GZM0598.png

原文地址:https://www.jb51.cc/xml/295228.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。