首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 XML 与 Java NIO 的较量 如何转移话题至缓冲区和通道(3)

使用 XML 与 Java NIO 的较量 如何转移话题至缓冲区和通道(3)

使用它虽然在本专栏文章发表时,还没有及时完成         XIReader 的第一版(我们的软件开发人员对我们的能力总是充满希望和自信,但在开发过程中他们常常会遇到一些问题,特别是在了解新库时),但是我可以编写一个简单的测试类,它使我可以对正则表达式 API ― 该类显示在 中 ― 进行试验。虽然它没有编写 XML 文档,但它已包含了通过正则表达式将文本文件分拆成其组成部分的逻辑。      
在         read() 方法中可以找到递归算法。XML 文档非常适合使用递归算法,因为它们的层次结构在本质上是可递归的。该算法如下:      
  • 给定一个字符串,它对           Match 进行循环以试图找到相应的正则表达式。
  • 对于连接到           Match 的每个           Group ,它打印其内容。
  • 如果           Group 名称与另一个           Ruleset 相匹配,那么递归调用就尝试进一步分解字符串(对于上一篇专栏文章示例中的           an:fields 元素,也是这么做的)。
  • 如果正则表达式没有完全处理完字符串,那么对未处理完的字符串继续应用递归调用。
清单 7. Test.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package org.ananas.xi;
import java.io.*;
import java.util.regex.*;
public class Test
{
   public static void main(String[] params)
      throws IOException
   {
      Ruleset[] rulesets = getRulesets();
      BufferedReader reader = new BufferedReader(new FileReader(params[0]));
      String st = reader.readLine();
      while(st != null)
      {
         read(rulesets,st);
         st = reader.readLine();
      }
   }
   public static Ruleset[] getRulesets()
   {
      Ruleset[] rulesets = new Ruleset[2];
      rulesets[0] = new Ruleset("http://ananas.org/2002/sample",
                                "address-book",
                                "an:address-book");
      rulesets[1] = new Ruleset("http://ananas.org/2002/sample",
                                "fields",
                                "an:fields");
      Match match = new Match("http://ananas.org/2002/sample",
                              "alias",
                              "an:alias",
                              "^alias (.*).*)$");
      Group group = new Group("http://ananas.org/2002/sample",
                              "id",
                              "an:id");
      match.addGroup(group);
      group = new Group("http://ananas.org/2002/sample",
                        "email",
                        "an:email");
      match.addGroup(group);
      rulesets[0].addMatch(match);
      match = new Match("http://ananas.org/2002/sample",
                        "note",
                        "an:note",
                        "^note .*.*)$");
      group = new Group("http://ananas.org/2002/sample",
                        "fields",
                        "an:fields");
      match.addGroup(group);
      rulesets[0].addMatch(match);
      match = new Match("http://ananas.org/2002/sample",
                        "fields",
                        "an:fields",
                        "[\\s]*<([^<]*)>");
      group = new Group("http://ananas.org/2002/sample",
                        "field",
                        "an:field");
      match.addGroup(group);
      rulesets[1].addMatch(match);
      return rulesets;
   }
   public static void read(Ruleset[] rulesets,String st)
   {
      read(rulesets,rulesets[0],st,false);
   }
   public static void
       read(Ruleset[] rulesets,Ruleset ruleset,String st,boolean next)
   {
      boolean found = false;
      for(int i = 0;i < ruleset.getMatchCount() && !found;i++)
      {
         if(ruleset.getMatchAt(i).matches(st))
         {
            found = true;
            Match match = ruleset.getMatchAt(i);
            if(!next)
            {
               System.out.print(ruleset.getMatchAt(i).getQualifiedName());
               System.out.print(' ');
            }
            for(int j = 1;j <= match.getGroupCount();j++)
            {
               String qname = match.getGroupNameAt(j).getQualifiedName();
               boolean deep = false;
               for(int k = 0;k < rulesets.length && !deep;k++)
                  if(rulesets[k].getQualifiedName().equals(qname))
                  {
                     System.out.print("\n >> \"");
                     System.out.print(match.getGroupValueAt(j));
                     System.out.print("\" >> ");
                     read(rulesets,rulesets[k],match.getGroupValueAt(j),false);
                     deep = true;
                  }
               if(!deep)
               {
                  System.out.print(match.getGroupNameAt(j).getQualifiedName());
                  System.out.print(' ');
                  System.out.print(match.getGroupValueAt(j));
                  System.out.print(' ');
               }
            }
            String rest = match.rest();
            if(rest != null)
               read(rulesets,ruleset,rest,true);
         }
      }
      System.out.println();
   }
}




不要被         getRulesets() 方法所困扰。它暂时在内存中创建了一个文件描述。在下一次迭代中,它将从 XML 文件中读取该文件描述。      
朝着 XIReader 前进我很快将有         XIReader 的工作版本。这里遗留的工作是用适当的         ContentHandler 调用来替代  中的         System.out.println() 。另外还需要开始完整地实现         XMLReader 接口,但这并不特别困难。      
正如本专栏文章清楚说明的那样,学习新库需要花许多时间。
返回列表