递归方式 DOM 解析(parse) XML

friends.xml

 

<?xml version="1.0" encoding="utf-8"?>


<friends date="2012">
    
 <!--此处为注释-->

    <friend id="1">

        <姓名>小红</姓名>
        <QQ>123456789</QQ>

    </friend>

 <friend>

        <姓名>小平</姓名>
        <QQ>12345678</QQ>

 </friend>

 <friend>

        <姓名 mark="hello">小敏</姓名>
        <QQ>1234567</QQ>

 </friend>

 <friend>

        <姓名>小良</姓名>
        <QQ>987654321</QQ>

 </friend>

 <friend>

        <姓名>小健</姓名>
        <QQ>98765432</QQ>

 </friend> 

</friends>


 

DOM   parse   XML

 

import java.io.File ;

import javax.xml.parsers.DocumentBuilderFactory ;
import javax.xml.parsers.DocumentBuilder ;

import org.w3c.dom.Element ;
import org.w3c.dom.Document ;
import org.w3c.dom.NamedNodeMap ;
import org.w3c.dom.NodeList ;
import org.w3c.dom.Attr ;
import org.w3c.dom.Node ;
import org.w3c.dom.Comment ;

//利用 递归 dom 解析任何xml文档,把xml文档加载到内存,占用内存大,可随机访问

public class RecursionDOM_XML
{
	public static void main(String[] args) throws Exception
	{
		//1.获取dom解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance() ;
        
		//2.获取具体的dom解析器
		DocumentBuilder db = dbf.newDocumentBuilder() ;
        
		//获取xml文档的 根节点
        Document document = db.parse(new File("friends.xml") );
        
		//获取文档的 根元素节点
		Element e = document.getDocumentElement() ;

		parseXML(e) ;

	}

	public static void parseXML(Element element)
	{
		//获取 元素节点 的 信息
		String name = element.getNodeName() ;
		System.out.print("< " + name) ;
        
		//获取此元素节点的属性
		NamedNodeMap map = element.getAttributes() ;
		
		//获取目前element元素节点下的 孩子节点(包括空格)
		NodeList child = element.getChildNodes() ;

		if (null != map)
		{
			for (int i = 0; i < map.getLength(); i++ )
			{
				Attr attr = (Attr)map.item(i) ;

                String name1 = attr.getName() ;
				String value1 = attr.getValue() ;
				System.out.print(" " + name1 +"=\"" + value1 +"\"") ;
			}

		}

		System.out.print(" >") ;

        for (int j = 0; j < child.getLength() ;j++ )
        {
			Node node = child.item(j) ;
            
			//判断该节点是不是 元素节点  ,递归路口
			if (node.getNodeType() == Node.ELEMENT_NODE)
			{
				//开始递归
				parseXML((Element)node) ;
			}
            
			//判断该节点是不是 文本,递归出口
			else if (node.getNodeType() == Node.TEXT_NODE)
			{
				System.out.print(node.getNodeValue() + "") ;

			}

			//判断该节点是不是 注释
			else if (node.getNodeType() == Node.COMMENT_NODE)
			{
				System.out.print("<!--");
				Comment comment = (Comment)node ;
				//注释内容
				String data = comment.getData() ;
				
				System.out.print(data);
				System.out.print("-->");

			}
        }

        System.out.println("</" + name + ">" ) ;


	}


}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值