Dom4J解析xml原理:简单地说,就是通过解析器将整个文档读取到Document对象中(加载成Document树),然后通过Document对象中可以获取到节点(Node)对象(Node对象有几种分类:标签、属性、文本和注释),得到了Node对象,就可以对整个xml进行解析了。
解析(将原xml原样输出)的代码如下:
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class readXmlFile {
@Test
public void readXmlFile() throws Exception{
SAXReader reader = new SAXReader();//获取解析器
Document doc = reader.read(new File("./xmlFile/contact.xml"));//读取xml文档
Element elem = doc.getRootElement();//首先获得根节点
StringBuffer sb = new StringBuffer();
getAllChildren(elem,sb);//获取根节点下所有的节点
System.out.println(sb);//输出解析的结果
}
public void getAllChildren(Element elem,StringBuffer str){
str.append("<"+elem.getName());//输出当前节点的名称
List<Attribute> list = elem.attributes();//查询当前标签的所有属性
if(list != null){//如果不为空,则遍历所有属性
for(Attribute attr:list){
str.append(" "+attr.getName()+"=\""+attr.getText()+"\"");
}
}
str.append(">");
Iterator<Node> nodes = elem.nodeIterator();//获取当前节点下的所有子节点
while(nodes.hasNext()){
Node node = nodes.next();
if(node instanceof Element){//如果是标签节点,则递归进行解析
getAllChildren((Element)node, str);
}
if(node instanceof Text){//如果是文本节点,则输出
str.append(node.getText());
}
}
str.append("</"+ elem.getName() +">");
}
}