2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Parse XML Tree 解析XML文件的代码实例

Parse XML Tree 解析XML文件的代码实例

时间:2022-01-10 00:08:52

相关推荐

Parse XML Tree 解析XML文件的代码实例

XML/RSS教程

Parse ,XML ,Tree

XML/RSS教程

教育类网页源码,vscode自动保存更改,ubuntu 出现菱形,怎么彻底删tomcat,潮阳爬虫,php 保存上传文件,台州seo站群系统,怎么检测杰奇手机小说网站,wp收费模板lzw

Parse XML Tree

栈法

美文分享网站源码,vscode页面背景,ubuntu16升级glibc,tomcat日志名称,sqlite官网书,js 不要日期时间插件,上海前端主流框架有哪些,基于golang的爬虫框架,php 匹配中文的正则,网站seo自动,免费团购网站,js css html写动画网页,web模板 保安服务lzw

复杂度

时间 O(N) 空间 O(N)

phpcms网站源码,vscode嵌套列表,ubuntu红外遥控器,tomcat是否有效,sqlite 字符的位置,jq计时器插件,前端框架的作用实例,什么是爬虫病毒,php文件输出,厦门seo招聘,系统管理网站源码,网页自适应手机浏览器,站长之源下载站模板,店铺商品详情页面模板html源码,资产管理系统免费源码,优策装修小程序3.1前端 后端开源版lzw

思路

这题首先要想清楚的是,如何表示XML,因为XML是典型的一父多子,我们用树来表示比较好。然后分析下如何用Tokenizer,Tokenizer有点像Iterator,每当我们用Tokenizer拿到一个Token时,如果这是一个Open的Token,我们需要新建一个节点,这个新节点下面也有可能有新节点。如果是一个Inner的Token,我们也需要新建一个节点,但这个节点下面不会有新的节点。如果是一个Close的Token,我们不需要新节点,而且需要保证上一个Open节点不再接纳新节点了,而对于新节点则要附在上一层的节点后面。这里,我们用栈可以保留上一层的节点信息,帮助我们建树。如果这是一个Open的Token,我们需要新建一个节点加入上一层节点后面,并加入栈中。如果是一个Inner的Token,我们也需要新建一个节点加到上一层节点后面,但不加入栈中。如果是一个Close的Token,则把上一层节点弹出栈。

代码

public class XMLParser { public static void main(String[] args){ XMLParser xml = new XMLParser(); XMLNode root = xml.parse("(open,html)(open,head)(inner,welcome)(close,head)(open,body)(close,body)(close,html)"); xml.printXMLTree(root, 0); } public XMLNode parse(String str){ // 以右括号为delimiter StringTokenizer tknz = new StringTokenizer(str, ")"); Stack stk = new Stack(); // 将第一个open节点作为根节点压入栈中 XMLNode root = convertTokenToTreeNode(tknz.nextToken()); stk.push(root); while(!stk.isEmpty()){ if(!tknz.hasMoreTokens()){break; } XMLNode curr = convertTokenToTreeNode(tknz.nextToken()); // 得到上一层节点 XMLNode father = stk.peek(); // 根据当前节点的类型做不同处理 switch(curr.type){// 对于Open节点,我们把它加入上一层节点的后面,并加入栈中case "open": father.children.add(curr); stk.push(curr); break;// Close节点直接把上一层Pop出来就行了,这样就不会有新的节点加到上一层节点后面 case "close": stk.pop(); break;// Inner节点只加到上一层节点后面 case "inner": father.children.add(curr); break; } } return root; } private XMLNode convertTokenToTreeNode(String token){ token = token.substring(1); String[] parts = token.split(","); return new XMLNode(parts[0], parts[1]); } private void printXMLTree(XMLNode root, int depth){ for(int i = 0; i < depth; i++){ System.out.print("-"); } System.out.println(root.type + ":" + root.value); for(XMLNode node : root.children){ printXMLTree(node, depth + 1); } }}class XMLNode { String type; String value; List children; XMLNode(String type, String value){ this.type = type; this.value = value; this.children = new ArrayList(); }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。