java StAX很多java人员不知道的小工具

您觉得自己懂 Java 编程?事实是,大多数开发人员都只领会到了 Java 平台的皮毛,所学也只够应付工作。有些Java工具无法分类,只能算作 “有用的东西”。这是developerworks5件事系列中介绍一些您乐于拥有的工具,即使您将它们放到厨房抽屉里。
编者按:本文为 Neward & Associates 的主管Ted Neward 撰写的5件你不知道的事情系列的最后一篇(至少目前是这样)。Ted Neward 在Neward & Associates负责有关 Java、.NET、XML 服务和其他平台的咨询、指导、培训和推介。他现在居住在华盛顿州西雅图附近。以下为本文的译文:
1. StAX
在千禧年左右,当 XML 第一次出现在很多 Java 开发人员面前时,有两种基本的解析 XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。DOM 解析器将整个 XML 文档加入内存,并切割成离散的对象,它们连接在一起形成一个树。该树描述了文档的整个 XML Infoset 表示法。这两个解析器都有缺点:SAX 太低级,无法使用,DOM 代价太大,尤其对于大的 XML 文件 ― 整个树成了一个庞然大物。幸运的是,Java 开发人员找到第三种方法来解析 XML 文件,通过对文档建模成 “节点”,它们可以从文档流中一次取出一个,检查,然后处理或丢弃。这些 “节点” 的 “流” 提供了 SAX 和 DOM 的中间地带,名为 “Streaming API for XML”,或者叫做StAX。(此缩写用于区分新的 API 与原来的 SAX 解析器,它与此同名。)StAX 解析器后来包装到了 JDK 中,在 javax.xml.stream 包。
使用 StAX 相当简单:实例化 XMLEventReader,将它指向一个格式良好的 XML 文件,然后一次 “拉出” 一个节点(通常用 while 循环),查看。例如,在清单 1 中,列举出了 Ant 构造脚本中的所有目标:
清单 1. 只是让 StAX 指向目标
import java.io.*;
import javax.xml.namespace.QName; 
import javax.xml.stream.*; 
import javax.xml.stream.events.*; 
import javax.xml.stream.util.*;  
public class Targets  {     
public static void main(String[] args) throws Exception  
{
     for (String arg : args)  {             
    XMLEventReader xsr =XMLInputFactory.newInstance().createXMLEventReader(new FileReader(arg));             
    while (xsr.hasNext())    
    {               
        XMLEvent evt = xsr.nextEvent();          
         switch (evt.getEventType())           
         {   
             case XMLEvent.START_ELEMENT:      
              {                         
                      StartElement se = evt.asStartElement();      
                     if (se.getName().getLocalPart().equals("target"))         
                        {                        
                                  Attribute targetName = se.getAttributeByName(new QName("name")); // Found a target!              
                                   System.out.println(targetName.getValue());    
                         }   
                          break;       
                }                      // Ignore everything else           
            }             
         }        
      }    
    }
 }  
StAX 解析器不会替换所有的 SAX 和 DOM 代码。但肯定会让某些任务容易些。尤其对完成不需要知道 XML 文档整个树结构的任务相当方便。
请注意,如果事件对象级别太高,无法使用,StAX 也有一个低级 API 在 XMLStreamReader 中。尽管也许没有阅读器有用,StAX 还有一个 XMLEventWriter,同样,还有一个 XMLStreamWriter 类用于 XML 输出。
 

你可能感兴趣的:(java,java解析xml,休闲,java小功能,javaStax)