如何使用SAXParser处理XML文档
来源:优易学  2011-3-2 12:36:09   【优易学:中国教育考试门户网】   资料下载   IT书店
在本文中主要就如何用SAX解析xml文档进行说明。
  要解析的xml片段如下:
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <Books>
  <Book id="8542f26f-80d4-4b7d-ab25-f80f72a852ef">
  <name id="201">
  <strings>
  <entry>
  <key>en_US</key>
  <value> thinking in Java</value>
  </entry>
  </strings>
  </name>
  <Author>
  <entry>
  <key>en_US</key>
  <value>Tom</value>
  </entry>
  </Author>
  <icon>
  <url>think_java.PNG</url>
  </icon>
  </Book>
  ...
  </Books>
  应用程序想从这个xml文档中读出各个book,并且需要提供查询功能,即给定书的id,能够找到作者和书名。
   当然,用jdom是很简单的方式,不过如果我们读到的是一个stream,并且比较大,那么我们最好用SAXParser,不需要把整个xml文档装入内存。
  首先,我们建立一个Book类,保存book相关的信息。
  public class Book { private String id = null; private String name = null; private String author = null; private Image image = null; // 一系列的get和set方法。略去
  public String toString() { return "Book [" + "ID=" + id + ", Name=" + name + ", Author=" + author + "]"; } }
  接下来我们新建一个类BooksSAXHandler,它扩展了DefaultHandler,用于解析xml。SAX解析是以事件为基础的,在这里我们处理三个事件,分别是startElement,endElement以及characters。为了获取一个element里面的text值,我们需要程序知道当前在处理那个结点,但仅仅知道结点也是不够的,因为可以有同名的结点,故此我们引入currentPath,这样可以唯一的定位到要处理的结点。下面给出了解析的方法,注意currentPath的用法。
  public void startElement(String uri, String localName, String qName,
  Attributes attributes) throws SAXException {
  currentPath.append(qName + "/");
  if (qName.equals(ELEMENT_BOOK)) {
  book = new Book();
  if (attributes.getQName(0).equals(ELEMENT_ID)) {
  book.setID(attributes.getValue(ELEMENT_ID));
  }
  }
  }
  public void endElement(String uri, String localName, String qName)
  throws SAXException {
  currentPath
  .delete(currentPath.lastIndexOf(qName), currentPath.length());
  if (qName.equals(ELEMENT_BOOK)) {
  booksMap.put(book.getID(), book);
  book = null;
  }
  }
  public void characters(char[] ch, int start, int length)
  throws SAXException {
  if (currentPath.toString().equals(NAME_PATH)) {
  book.setName(new String(ch, start, length));
  } else if (currentPath.toString().equals(AUTHOR_PATH)) {
  book.setAuthor(new String(ch, start, length));
  }
  }
  接下来,我们用javax.xml.parsers.SAXParser来解析这个xml文档,SAXParser需要两个参数,一个是要解析的 stream流,另外一个就是DefaultHandler的对象。到此为止,我们已经清楚了解析这个xml的全部过程。在附件中有例子的完整代码。 用户界面是用jface的TableViewer实现的。这里简单介绍一下TableViewer的用法。定义了TableViewer之后,关键需要设置以下三个方法。 tableViewer.setContentProvider(new BooksContentProvider()); tableViewer.setLabelProvider(new BooksLabelProvider()); tableViewer.setInput(getBooks()); 其中getBooks()是提供数据的,返回所有数据的列表,在本例返回List<Book>。 BooksLabelProvider需要实现ITableLabelProvider,主要是返回table的对应列的值。其中有两个主要的方法,String getColumnText(Object element, int columnIndex) 以及Image getColumnImage(Object element, int columnIndex)。 在本例中,element对应一个Book对象,getColumnText返回table对应列的文本值,包括Book的ID,Name,Author等。getColumnImage 则返回table对应列的Image,这里对应Book的Image.

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训