您的位置:首页 > 其它

递归方式 DOM 解析(parse) XML

2012-02-26 01:46 302 查看
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 + ">" ) ;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: