假设有如下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