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

使用 XML 与 Java NIO 的较量 如何转移话题至缓冲区和通道(3)
使用它虽然在本专栏文章发表时,还没有及时完成 XIReader 的第一版(我们的软件开发人员对我们的能力总是充满希望和自信,但在开发过程中他们常常会遇到一些问题,特别是在了解新库时),但是我可以编写一个简单的测试类,它使我可以对正则表达式 API ― 该类显示在 中 ― 进行试验。虽然它没有编写 XML 文档,但它已包含了通过正则表达式将文本文件分拆成其组成部分的逻辑。
在 read() 方法中可以找到递归算法。XML 文档非常适合使用递归算法,因为它们的层次结构在本质上是可递归的。该算法如下:
- 给定一个字符串,它对 Match 进行循环以试图找到相应的正则表达式。
- 对于连接到 Match 的每个 Group ,它打印其内容。
- 如果 Group 名称与另一个 Ruleset 相匹配,那么递归调用就尝试进一步分解字符串(对于上一篇专栏文章示例中的 an:fields 元素,也是这么做的)。
- 如果正则表达式没有完全处理完字符串,那么对未处理完的字符串继续应用递归调用。
清单 7. Test.java1
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 接口,但这并不特别困难。
正如本专栏文章清楚说明的那样,学习新库需要花许多时间。 |
|
|
|
|
|