小菜毛毛技术分享

与大家共同成长

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

2011年5月11日 #

 
SAX解析XML实例
实例:以下输出中的所有属性和标签值
package com.meixin.xml;

import java.io.File;
import java.util.HashMap;
import java.util.Vector;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class PraseXML extends DefaultHandler
{

  private Vector<String> tagName;

  private Vector<String> tagValue;

  private int step;

  // 开始解析XML文件
  public void startDocument() throws SAXException
  {
    tagName = new Vector<String>();
    tagValue = new Vector<String>();
    step = 0;
  }

  // 结束解析XML文件
  public void endDocument() throws SAXException
  {
    for (int i = 0; i < tagName.size(); i++)
    {
      if (!tagName.get(i).equals("") || tagName.get(i) != null)
      {
        System.out.println("节点名称:" + tagName.get(i));
        System.out.println("节点值:" + tagValue.get(i));
      }
    }
  }

  /**
    * 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分
    * 这些重复的元素.qName是什么? <name:page ll=""></name:page>这样写就会抛出SAXException错误
    * 通常情况下qName等于localName
    */

  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException
  {
    // 节点名称
    tagName.add(qName);
    // 循环输出属性
    for (int i = 0; i < attributes.getLength(); i++)
    {
      // 获取属性名称
      System.out.println("属性名称:" + attributes.getQName(i));
      // 获取属性值
      System.out.println("属性值:"
          + attributes.getValue(attributes.getQName(i)));
    }

  }

  /**
    * 在遇到结束标签时调用此方法
    */

  public void endElement(String uri, String localName, String qName)
      throws SAXException
  {

    step = step + 1;
  }

  /**
    * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048,
    * 每解释到新的字符会把它添加到char[]里。    * 注意,这个char字符会自己管理存储的字符,
    * 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的,
    * 暂时找不到规律,以后看源代码.
    *    
    * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值
    */

  public void characters(char ch[], int start, int length)
      throws SAXException
  {
    // 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内
    if (tagName.size() - 1 == tagValue.size())
    {
      tagValue.add(new String(ch, start, length));
    }
  }

  public static void main(String[] args)
  {
    String filename = "MyXml.xml";
    SAXParserFactory spf = SAXParserFactory.newInstance();
    try
    {
      SAXParser saxParser = spf.newSAXParser();
      saxParser.parse(new File(filename), new PraseXML());
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public Vector getTagName()
  {
    return tagName;
  }

  public void setTagName(Vector tagName)
  {
    this.tagName = tagName;
  }

  public Vector getTagValue()
  {
    return tagValue;
  }

  public void setTagValue(Vector tagValue)
  {
    this.tagValue = tagValue;
  }

}
输出结果:
属性名称:personid
属性值:e01
属性名称:enable
属性值:true
属性名称:personid
属性值:e02
属性名称:enable
属性值:false
属性名称:personid
属性值:e03
属性名称:enable
属性值:true
节点名称:people
节点值:

    
节点名称:person
节点值:
    
节点名称:name
节点值:张三
节点名称:tel
节点值:5128
节点名称:email
节点值:txq512@sina.com
节点名称:person
节点值:
    
节点名称:name
节点值:meixin
节点名称:tel
节点值:5252525
节点名称:email
节点值:wnight88@sina.com
节点名称:person
节点值:
    
节点名称:name
节点值:yu
节点名称:tel
节点值:5389654
节点名称:email
节点值:yu@188.net
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<people>

  <person personid="e01" enable="true">
    <name>张三</name>
    <tel>5128</tel>
    <email>txq512@sina.com</email>
  </person>
    
  <person personid="e02" enable="false">
    <name>meixin</name>
    <tel>5252525</tel>
    <email>wnight88@sina.com</email>
  </person>
    
  <person personid="e03" enable="true">
    <name>yu</name>
    <tel>5389654</tel>
    <email>yu@188.net</email>
  </person>
    
</people>

http://wnight88.blog.51cto.com/512204/163197/
posted @ 2011-05-11 22:34 小菜毛毛 阅读(3060) | 评论 (0)编辑 收藏