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>
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>