[Algo] Parse XML Tree 解析XML文件

前端之家收集整理的这篇文章主要介绍了[Algo] Parse XML Tree 解析XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Parse XML Tree

现在有一个Tokenizer,返回的Token都是XML标签或者内容,比如(open,html)(inner,hello)(close,html)表示<html>hello</html>,每一个括号及其内容是一个Token,请问如何表示这个XML文件

栈法

复杂度

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

思路

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

代码

  1. public class XMLParser {
  2. public static void main(String[] args){
  3. XMLParser xml = new XMLParser();
  4. XMLNode root = xml.parse("(open,html)(open,head)(inner,welcome)(close,head)(open,body)(close,html)");
  5. xml.printXMLTree(root,0);
  6. }
  7. public XMLNode parse(String str){
  8. // 以右括号为delimiter
  9. StringTokenizer tknz = new StringTokenizer(str,")");
  10. Stack<XMLNode> stk = new Stack<XMLNode>();
  11. // 将第一个open节点作为根节点压入栈中
  12. XMLNode root = convertTokenToTreeNode(tknz.nextToken());
  13. stk.push(root);
  14. while(!stk.isEmpty()){
  15. if(!tknz.hasMoreTokens()){
  16. break;
  17. }
  18. XMLNode curr = convertTokenToTreeNode(tknz.nextToken());
  19. // 得到上一层节点
  20. XMLNode father = stk.peek();
  21. // 根据当前节点的类型做不同处理
  22. switch(curr.type){
  23. // 对于Open节点,我们把它加入上一层节点的后面,并加入栈中
  24. case "open":
  25. father.children.add(curr);
  26. stk.push(curr);
  27. break;
  28. // Close节点直接把上一层Pop出来就行了,这样就不会有新的节点加到上一层节点后面
  29. case "close":
  30. stk.pop();
  31. break;
  32. // Inner节点只加到上一层节点后面
  33. case "inner":
  34. father.children.add(curr);
  35. break;
  36. }
  37. }
  38. return root;
  39. }
  40. private XMLNode convertTokenToTreeNode(String token){
  41. token = token.substring(1);
  42. String[] parts = token.split(",");
  43. return new XMLNode(parts[0],parts[1]);
  44. }
  45. private void printXMLTree(XMLNode root,int depth){
  46. for(int i = 0; i < depth; i++){
  47. System.out.print("-");
  48. }
  49. System.out.println(root.type + ":" + root.value);
  50. for(XMLNode node : root.children){
  51. printXMLTree(node,depth + 1);
  52. }
  53. }
  54. }
  55.  
  56. class XMLNode {
  57. String type;
  58. String value;
  59. List<XMLNode> children;
  60. XMLNode(String type,String value){
  61. this.type = type;
  62. this.value = value;
  63. this.children = new ArrayList<XMLNode>();
  64. }
  65. }

猜你在找的XML相关文章