使用DocumentBuilderFactory解析和深度优先遍历XML DOM全部节点

假设有如下xml dom,对其进行深度优先遍历解析

<?xml version='1.0' encoding='UTF-8' ?>
<schools>
<school id="huanggang">
	<grade id="1">
		<classes>
			<class id="1">
				<students>
					<student id="1" name="zhangsan"></student>
					<student id="2" name="lisi"></student>
					<student id="3" name="wangwu"></student>
				</students>
			</class>
		</classes>
	</grade>
	<grade id="2">
		<classes>
			<class id="1">
				<students>
					<student id="1" name="zhangsan2"/>
					<student id="2" name="lisi2"/>
					<student id="3" name="wangwu2"/>
				</students>
			</class>
		</classes>
	</grade>
</school>
<school id="qifu">
	<grade id="1">
		<classes>
			<class id="1">
				<students>
					<student id="1" name="zhangsan3"></student>
					<student id="2" name="lisi3"></student>
					<student id="3" name="wangwu3"></student>
				</students>
			</class>
		</classes>
	</grade>
	<grade id="2">
		<classes>
			<class id="1">
				<students>
					<student id="1" name="zhangsan4"/>
					<student id="2" name="lisi4"/>
					<student id="3" name="wangwu4"/>
				</students>
			</class>
		</classes>
	</grade>
</school>
</schools>

遍历解析


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ParseStudents {

	public static void main(String[] args) throws Exception
	{
		String filePath = "D:\\students.xml";
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(filePath);
        Element root = doc.getDocumentElement();
        NodeList nodeList = root.getChildNodes();
        
        if (null != nodeList) {
        	int i=0;
        	//开始遍历school 
        	while(i<nodeList.getLength())
        	{
        		//school 
        		Node node = nodeList.item(i);
        		//期间还会遍历出Text节点,而我们只关注element节点
                if(node.getNodeType()==Node.ELEMENT_NODE)
                {
                	int layer_level = 1;
                	//第一个school
                	printnodeinfo((Element)node);
                	Node c_node = node.getFirstChild();
                	//判断节点是否存在
                	while(c_node!=null)
                	{
                		if(c_node.getNodeType()==Node.ELEMENT_NODE)
                		{
                			Element element_childnode  = (Element)c_node;
                			printnodeinfo(element_childnode);
                			//查看是否存在子节点.如果存在,输出当前节点结果,然后继续找子节点,如果没有子节点,则遍历兄弟节点
                			if(element_childnode.hasChildNodes())
                			{
                				c_node = element_childnode.getFirstChild();
                				layer_level = layer_level + 1;
                				continue;
                			}
                			//没有子节点,有兄弟节点,因为Text节点和Element节点间隔出现,而我们只关心Element节点,所有有两次getNextSibling()
                			if(element_childnode.getNextSibling().getNextSibling()!=null)
                			{
                				c_node = element_childnode.getNextSibling().getNextSibling();
                				continue;
                			}
                			//没有子节点,又没有兄弟节点,则返回上一层节点,因为上一层节点已经遍历过了,所以找它的兄弟节点
                			while(layer_level>1)
                			{
                				layer_level = layer_level - 1;
                				c_node = c_node.getParentNode();
                				//如果有兄弟节点则继续兄弟节点,否则又再往上一层
                				if(c_node.getNextSibling().getNextSibling()!=null)
                				{
                					c_node = c_node.getNextSibling();
                					break;
                				}
                			}
                		}
                		c_node = c_node.getNextSibling();
                	}
                }
                else if(node.getNodeType()==Node.COMMENT_NODE)
                {	
                	//直接删除注释节点
                	root.removeChild(node);
                	continue;
                }
                i++;
        	}
        }
        //创建新的xml dom
//        TransformerFactory transformerFactory = TransformerFactory.newInstance();
//        Transformer transformer = transformerFactory.newTransformer();
//        transformer.transform(new DOMSource(doc), new StreamResult("D:\\newstudents.xml"));
	}

	public static void printnodeinfo(Element element_node)
	{
		System.out.println("tagname:"+element_node.getTagName()+"\tid:"+element_node.getAttribute("id")+"\tname:"+element_node.getAttribute("name"));
	}
}

输出结果,也为遍历顺序

tagname:school	id:huanggang	name:
tagname:grade	id:1	name:
tagname:classes	id:	name:
tagname:class	id:1	name:
tagname:students	id:	name:
tagname:student	id:1	name:zhangsan
tagname:student	id:2	name:lisi
tagname:student	id:3	name:wangwu
tagname:grade	id:2	name:
tagname:classes	id:	name:
tagname:class	id:1	name:
tagname:students	id:	name:
tagname:student	id:1	name:zhangsan2
tagname:student	id:2	name:lisi2
tagname:student	id:3	name:wangwu2
tagname:school	id:qifu	name:
tagname:grade	id:1	name:
tagname:classes	id:	name:
tagname:class	id:1	name:
tagname:students	id:	name:
tagname:student	id:1	name:zhangsan3
tagname:student	id:2	name:lisi3
tagname:student	id:3	name:wangwu3
tagname:grade	id:2	name:
tagname:classes	id:	name:
tagname:class	id:1	name:
tagname:students	id:	name:
tagname:student	id:1	name:zhangsan4
tagname:student	id:2	name:lisi4
tagname:student	id:3	name:wangwu4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值