Java解析XML文件

package com.yc.ycportal.ge.util;

import java.io.FileInputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;

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

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
* @author
* 本类的作用是对properties和xml文件的解析,重点在于包括xml文件的两种解析方式
* 现在有三种用于Java的流行xml解析技术,文档对象模型(Document Object Model,DOM),基于W3C的
* 成熟标准,2、用于XML的简单API(Simple API for XML),第一个被广泛采用的用Java编写的XML API
* 是一个事实上的标准,3、用于XML的数据流API(Straming API for XML,StAX),JSR-173中采用
* 的一个新解析模型
*/
public class ParseFile {

public static ParseFile getInterface(){
    return new ParseFile();
}

/**解析Properties文件获取数据信息*/
/**
    *properties的文件格式为
    *username=sa
    *userpass=123以第一等号为标准,后面为它的值
    */
public List getPropertes(String fileName){
    List list = null;
    ResourceBundle rb = ResourceBundle.getBundle(fileName);
    list.add(rb.getString("username"));
    list.add(rb.getString("userpass"));
    return list;
}
/**用SAX方式解析XML文件获取数据信息,创建一个解析XML文件的内部类解析器*/
class ParseXML extends DefaultHandler{
    //所有的方法是子类重写父类的方法
    String currentName = null;
    StringBuffer currentValue = new StringBuffer();
    Properties properties = null;
 
    //接收元素开始的通知。
    //默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作
    public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException{
     this.currentValue.delete(0, this.currentValue.length());
     this.currentName = qName;
    }
    //接收元素中字符数据的通知
    //默认情况下,不执行任何操作。应用程序编写者可以重写此方法,以便对每块字符数据采取特定的措施
    //如将该数据添加到节点或缓冲区,或者将该数据打印到文件。
    public void characters(char[] ch,int start,int length)throws SAXException{
     this.currentValue.append(ch,start,length);
    }
    //接收元素结束的通知
    //默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作
    //如,结束树节点或将输出写入文件。
    public void endElement(String uri,String localName,String qName)throws SAXException{
     this.properties.put(qName.toLowerCase(), this.currentValue.toString().trim());
    }
    //返回存储XML信息数据的properties
    public Properties getProperties(){
     return this.properties;
    }
}
public List getSAXXml(String fileName)throws Exception{
    List list = null;
    ParseXML parsexml = new ParseXML();
    Properties properties = null;
    SAXParserFactory factory = SAXParserFactory.newInstance();
    //如果由此代码生成的解析器将提供对 XML 名称空间的支持,则为 true;否则为 false。
    factory.setNamespaceAware(false);
    //指定由此代码生成的解析器将验证被解析的文档。默认情况下,其值设置为 false
    factory.setValidating(false);
    SAXParser parser = factory.newSAXParser();
    //使用指定的DefaultHandler将指定文件的内容解析为 XML。
    parser.parse(fileName, parsexml);
    properties = parsexml.getProperties();
    Enumeration em = properties.keys();
    while(em.hasMoreElements()){
     list.add(properties.get(em.nextElement().toString()));
    }
    return list;
}
/**用Dom方式解析XML文件获取数据信息,比较容易理解和掌握的一种方式very good*/
public List getDOMXml(String fileName)throws Exception{
    List list = null;
    SAXBuilder builder = new SAXBuilder();
    Document document = builder.build(new FileInputStream(fileName));
    //document.getRootElement()获取根节点返回一个Element
    List listchild = document.getRootElement().getChildren("table");
    for(int i=0;i<listchild.size();i++){
     Element e = (Element)listchild.get(i);
     String tableName = e.getChild("tablename").getText();
     List nextchild = e.getChild("fields").getChildren("field");
     list.add(tableName);
     for(int j=0;j<nextchild.size();j++){
      Element child = (Element)nextchild.get(j);
      list.add(child.getAttributeValue("name"));
     }
    }
    //返回的List的结构是以表名为0个索引位置后面依次为表的字段名称,附带XML文件描述
    return list;
}
}


<?xml version="1.0" encoding="gb2312" ?>
<tables>
<table>
      <tablename>dic_rate_zhwd</tablename>
      <fields>
         <field name="organ_id" type="string"/>
         <field name="business_id" type="string"/>
         <field name="business_name" type="string"/>
         <field name="rate" type="double"/>
    </fields>
</table>
</tables>

你可能感兴趣的:(java,xml)