SAX 读取xml文件

原创 2004年07月07日 12:42:00
package project.util.xml;

import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import org.apache.log4j.*;
import org.jdom.*;
import org.jdom.input.*;

/**
 * <p>Title: <font color="steelblue" size="10">读取xml文件信息</font></p>
 * <p>Description: <font color="steelblue">从XML配置文件中获得配置信息。excerpt form jdom。</font></p>
 * <p>Copyright: <font color="steelblue">Copyright (c) 2004</font></p>
 * <p>Company: <font color="steelblue">Harmonious</font></p>
 * @author <font color="steelblue">TZL</font>
 * @version <font color="steelblue">1.0</font>
 */

public class XMLReader {
  /*
   #设置根的输出配置,格式为 "info [2004-05-01 22:35:30] [name]logname(b.c) [line] 86 msg-->log信息"
   log4j.rootLogger=DEBUG, rootAppender
   log4j.appender.rootAppender=org.apache.log4j.RollingFileAppender
   log4j.appender.rootAppender.File=e:/MapXtremeSmpl.log
   log4j.appender.rootAppender.MaxFileSize=1000KB
   log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout
   log4j.appender.rootAppender.layout.ConversionPattern=%-5p [%d{yyyy-mm-dd HH:mm:ss}] [name] %c{2} [line] %L  msg--> %m%n
   */
  static public Logger log = Logger.getLogger(XMLReader.class);
  protected Element m_RootElement = null;
  protected String m_webAppPath = null;

  /**
   * <font color="orange">构造函数。</font>
   * @param xmlFile <font color="steelblue">要读取的配置文件的绝对路径。</font>
   */
  public XMLReader(String xmlFile) {
    m_webAppPath = null;
    try {
      PatternLayout layout = new PatternLayout("%-5p %d{yyyy-MM-dd HH:mm:ss} [name] %c{2} [line] %L [msg] %m%n");
      ConsoleAppender appender = new ConsoleAppender(/*new SimpleLayout(),*/layout, "System.err");
      log.addAppender(appender);

      SAXBuilder builder = new SAXBuilder();
      document.nbspdoc = null;
      doc = builder.build(new FileInputStream(xmlFile));
      m_RootElement = doc.getRootElement();
    }
    catch (IOException ex) {
      log.error("XMLReader构造时出现IO错误:" + ex.toString());
    }
    catch (JDOMException ex1) {
      log.error("XMLReader构造时分析XML文件出错:" + ex1.toString());
    }
    catch (Exception ex) {
      log.error("XMLReader 构造出错:" + ex.toString());
    }
  }

  /**
   * <font color="orange">构造函数。配置文件必须指定为发布的应用的根目录下的/XmlConfig/Config.xml。</font>
   * @param servletObj <font color="steelblue">随便一个HttpServlet对象。</font>
   */
  public XMLReader(HttpServlet servletObj) {
    m_webAppPath = servletObj.getServletContext().getRealPath("/");
    String configFileName = m_webAppPath + "XmlConfig/Config.xml";

    try {
      PatternLayout layout = new PatternLayout("%-5p %d{yyyy-MM-dd HH:mm:ss} [name] %c{2} [line] %L [msg] %m%n");
      ConsoleAppender appender = new ConsoleAppender( /*new SimpleLayout(),*/layout, "System.err");
      log.addAppender(appender);

      SAXBuilder builder = new SAXBuilder();
      document.nbspdoc = null;
      doc = builder.build(new FileInputStream(configFileName));
      m_RootElement = doc.getRootElement();
    }
    catch (IOException ex) {
      log.error("XMLReader构造时出现IO错误(/XmlConfig/Config.xml):" + ex.toString());
    }
    catch (JDOMException ex1) {
      log.error("XMLReader构造时分析XML文件出错(/XmlConfig/Config.xml):" + ex1.toString());
    }
    catch (Exception ex) {
      log.error("XMLReader构造出错(/XmlConfig/Config.xml):" + ex.toString());
    }
  }

  /**
   * <font color="orange">web应用发布在web服务器的绝对路径根目录,最后已经有目录分割符。</font>
   * @return <font color="tomato">返回web应用发布在web服务器的绝对路径的根目录。</font>
   */
  public String getWebAppPath() {
    return m_webAppPath;
  }

  /**
   * <font color="orange">从配置文件中获得配置信息。</font>
   * @param key <font color="steelblue">要获取的配置名称。</font>
   * @param curRootName <font color="steelblue">查找的起始节点名称,如果为null从根开始查找。</font>
   * @return <font color="tomato">配置的字符串。</font>
   */
  public String getElementvalue(String curRootName, String key) {
    String value = null;
    Element curRoot = getElement(null, curRootName);
    if (null == curRoot) {
      curRoot = m_RootElement;
    }
    Element keyNode = getElement(curRoot, key);
    if (null != keyNode) {
      value = keyNode.getTextTrim();

    }
    return value;
  }

  /**
   * <font color="orange">根据名字获得节点。广度遍历,递归调用。</font>
   * @param nodeName <font color="steelblue">节点的名字。</font>
   * @param curRoot <font color="steelblue"> 从开始查找的起始节点,如果为null从根开始查找。</font>
   * @return <font color="tomato">返回从指定节点下找到的第一个节点。如果没有返回null。</font>
   */
  private Element getElement(Element curRoot, String nodeName) {
    Element retElement = null;

    if (null == nodeName)
      return m_RootElement;

    if (null == curRoot) {
      curRoot = m_RootElement;
    }

    if (null != curRoot) {
      retElement = curRoot.getChild(nodeName);
      if (null == retElement) {
        List nestElements = curRoot.getChildren();
        Iterator iterator = nestElements.iterator();
        while (iterator.hasNext() && null == retElement) {
          retElement = getElement( (Element) iterator.next(), nodeName);
        }
      }
    }

    return retElement;
  }

  /**
   * <font color="orange">获得指定节点的属性。</font>
   * @param elementName <font color="steelblue">节点的名称。</font>
   * @param attName <font color="steelblue">要获得的属性的名称。</font>
   * @return <font color="tomato">要查找的属性的值。</font>
   */
  public String getElementAtrribute(String elementName, String attName)
  {
    Element el = getElement(null, elementName);
    if (null == el)
      return null;

    return el.getAttributevalue(attName);
  }

}

java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB

在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB 1.  DOM(Document Object Model)   此 方法主要由W3C提供,它将xml文件全...
  • songjinbin
  • songjinbin
  • 2013年11月26日 14:41
  • 3100

第一次写-如何用SAX高效解析超大XML文件

最近用到xml文件想把它读取之后存到数据库里面,但是在网上找了一些方法,发现不是会出现文件过大导致堆溢出的问题,就是效率太低,几百万条数据需要好几个小时甚至一两天,于是我就捉摸着自己写了一个。是用SA...
  • xianyucishi
  • xianyucishi
  • 2016年08月10日 14:05
  • 2004

XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容

一、新建Demo2类: import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAX...
  • qq_32059827
  • qq_32059827
  • 2016年05月31日 13:16
  • 930

学习笔记-Java中的xml文件读取之SAX解析

SAX解析也是官方的一种XML文件解析方式,它是一种基于事件驱动的解析方式,使用到了回调机制。在解析的时候,并不会一次加载整个XML文件,而是以一种类似于流方式的加载方式。对于解析大型文件来说,十分有...
  • Right_o
  • Right_o
  • 2016年07月06日 23:05
  • 1427

QT开发(四十三)——SAX方式解析XML

QT开发(四十三)——SAX方式解析XML一、SAX简介SAX是Simple API for XML的简写,是一种解析XML文件的替代方法,不是由W3C官方所提出的标准,是一种事件驱动的XML API...
  • A642960662
  • A642960662
  • 2017年03月26日 12:47
  • 296

java中使用SAX读取和写出XML文件

SAX是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具有速度快,内存占用上的优点。SAX往往是大容量XML...
  • chjttony
  • chjttony
  • 2012年05月28日 20:21
  • 12393

SAX方式写入XML文件

SAX方式写入XML文件
  • zjs261019
  • zjs261019
  • 2016年11月14日 19:10
  • 321

SAX解析XML文档的时候在characters方法中解析有的时候xml文档格式凌乱的时候拿不到数据

首先我们先将xml何为格式好何为格式不好讲清楚 先上格式好的图 在一个就是格式不好的图 我们可以看出来,格式好的与格式不好的之间的差别在于, 不好的多了很多 \n \t 这样的换...
  • u013803262
  • u013803262
  • 2016年07月02日 23:02
  • 1609

Java读写XML文件的四种方式(DOM、SAX、JDOM、DOM4J)简述与比较

DOM(Document Object Model)  DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准;它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个...
  • u011453631
  • u011453631
  • 2014年10月23日 14:05
  • 4212

用sax读取XML时不能读取换行符号后面的内容的问题

使用SAX解析XML文档效率比较高,占用内存比较少,所以是Android中解析XML的首先方案。但使用SAX解析XML文档编写程序确不太方便,如果对SAX解析机制不太了解的话,很容易漏掉文本内容。 ...
  • jiangxiabeijing
  • jiangxiabeijing
  • 2011年09月20日 20:15
  • 1089
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SAX 读取xml文件
举报原因:
原因补充:

(最多只允许输入30个字)