构建轻量级XML DOM分析程序(2)

定义XML语法分析基本元素

为了把一个XML文件处理成为上面提到的简化的DOM树模型,我们必须定义一些基本的语法分析规则。使用这些规则,语法分析程序就能容易地从输入的XML文件中提取标记或者文本块。

第一个是peek,从输入的XML文件中返回下一个字符,而实际上则不必从下层流中获得这个字符。通过保持输入流的完整性,高级函数比如readTag和readText(后面将介绍)可以更加容易地根据它们接下来期待的字符获取需要的内容。

 
 
  1. private int peek() throws IOException {   
  2. reader.mark(1);   
  3. int result = reader.read();   
  4. reader.reset();   
  5. return result;   
  6. }   

下一个方法是skipWhitespce,作用是跳过输入的XML流中的空格、制表符或者回车符。

 
 
  1. private void skipWhitespace() throws IOException {   
  2. while (Character.isWhitespace((char) peek())) {   
  3. reader.read();   
  4. }   
  5. }  

在创建了如上所述的这两个方法后,我们就可以写一个函数从输入文件中检索XML标记。

 
 
  1. private String readTag() throws IOException {   
  2. skipWhitespace();   
  3. StringBuffer sb = new StringBuffer();   
  4. int next = peek();   
  5. if (next != '<') {   
  6. throw new IOException   
  7. ("Expected > but got " + (char) next);   
  8. }   
  9. sb.append((char)reader.read());   
  10. while (peek() != '>') {   
  11. sb.append((char)reader.read());   
  12. }   
  13. sb.append((char)reader.read());   
  14. return sb.toString();   
  15. }  

和peek方法联合使用,readTag函数只获得一个标记的内容,而让别的函数去处理其他的内容。 最后的一个方法是readText函数,用来读取XML标记之间的文本。

 
 
  1. private String readText() throws IOException {   
  2. int[] cdata_start = {'<', '!',   
  3. '[', 'C', 'D', 'A', 'T', 'A', '['};   
  4. int[] cdata_end = {']', ']', '>'};   
  5. StringBuffer sb = new StringBuffer();   
  6. int[] next = new int[cdata_start.length];   
  7. peek(next);   
  8. if (compareIntArrays(next, cdata_start) == true) {   
  9. // CDATA   
  10. reader.skip(next.length);   
  11. int[] buffer = new int[cdata_end.length];   
  12. while (true) {   
  13. peek(buffer);   
  14. if (compareIntArrays   
  15. (buffer, cdata_end) == true) {   
  16. reader.skip(buffer.length);   
  17. break;   
  18. } else {   
  19. sb.append((char)reader.read());   
  20. }   
  21. }   
  22. } else {   
  23. while (peek() != '<') {   
  24. sb.append((char)reader.read());   
  25. }   
  26. }   
  27. return sb.toString();   
  28. }   

这次使用的peek方法是前面那个从基本的XML文档返回一个字符串序列的peek方法的变体。这个peek变体让语法分析程序判断它将分析的文本是否被装入一个CDATA块。compareIntArrays函数是一个执行两个整数数组的深度比较的简单程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值