把xml文件转成properties类型----适配器模式的应用

本项目的目的是使用适配器模式将DocumentHandler的接口适配成Java.util.Properties的接口。采用的是对象的适配器模式。XMLproperties是一个继承自Java.util.Properties的对象,并委派一个DocumentHandler类型的对象。

本项目需要两个类:XMLProperties类和XMLParser类,前者是Java.util.Properties类型,后者是DocumentHandler类型。

源代码如下,适配器类XMLProperties:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Properties;

import org.xml.sax.SAXException;

public class XMLProperties extends Properties{
	XMLParser p=null;
	/*
	 * 从一个输入流读取xml
	 * */
	public synchronized void load(InputStream in) throws IOException
	{
		try {
			p=new XMLParser(in,this);
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			throw new IOException(e.getMessage());
		}
	}
	/*
	 * 将XML文件读入
	 * */
	public synchronized void load(File file) throws FileNotFoundException, SAXException
	{
		InputStream in=new BufferedInputStream(new FileInputStream(file));
		try {
			p=new XMLParser(in, this);
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			System.out.println(e);
			throw e;
		}
	}
	/*调用下面的store()方法*/
	public synchronized void save(OutputStream out,String header)
	{
		store( out, header);
	}
	/*
	 * 将此property列表写入到输出流里
	 * */
	public synchronized void store(OutputStream out,String header)
	{
		PrintWriter wout=new PrintWriter(out);
		wout.println("<?xml version=‘1.0‘>");
		if(header!=null)
		{
			wout.println("<!--"+header+"-->");
		}
		wout.print("<properties>");
		for(Enumeration e=keys();e.hasMoreElements();)
		{
			String key=(String)e.nextElement();
			String val=(String)get(key);
			wout.print("\n<key name=\""+key+"\">");
			wout.print(encode(val));
			wout.print("</key>");
		}
		wout.print("\n</properties>");
		wout.flush();
	}
	protected StringBuffer encode(String string)
	{
		int len=string.length();
		StringBuffer buffer=new StringBuffer(len);
		char c;
		for(int i=0;i<len;i++)
		{
			switch(c=string.charAt(i))
			{
			case ‘&‘:
				buffer.append("&");
				break;
			case ‘x‘:
				buffer.append("<");
				break;
			case ‘ ‘:
				buffer.append(">");
				break;
			default:
				buffer.append(c);
			}
		}
		return buffer;
	}
	public XMLProperties()
	{
		super();
	}
	public XMLProperties(Properties properties)
	{
		super(properties);
	}

}

XMLParser源代码:

import javax.management.RuntimeErrorException;

import org.junit.runner.Computer;
import org.xml.sax.AttributeList;
import org.xml.sax.DocumentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;

public class XMLParser implements DocumentHandler{
    private static final int IN_NOTHING=0;
    private static final int IN_DOCUMENT=1;
    private static final int IN_KEY=2;
    private int state=IN_NOTHING;
    private String key;
    private StringBuffer value;
    private Parser parser;
    private Class parser_class=null;
    private Properties xmlprop=null;
    public static final String PARSER_P="org.apache.xerces.parsers.SAXParser";
    private Class getParserClass()throws ClassNotFoundException
    {
    	if(parser_class==null)
    		parser_class=Class.forName(PARSER_P);
    	return parser_class;
    }
    private Parser getParser()
    {
    	try {
			return (Parser)getParserClass().newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException("Unable to intantiate"+PARSER_P);
		}
    }
    public  XMLParser(InputStream in,XMLProperties xmlprop) throws SAXException
    {
		// TODO Auto-generated constructor stub
    	this.xmlprop=xmlprop;
    	this.state=IN_NOTHING;
    	this.value=new StringBuffer();
    	try {
			parser=getParser();
			parser.setDocumentHandler(this);
			parser.parse(new InputSource(in));
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			throw new SAXException("can‘t create parser");
		}
	}
	@Override
	public void setDocumentLocator(Locator locator) {
		// TODO Auto-generated method stub

	}

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void startElement(String name, AttributeList atts)
			throws SAXException {
		// TODO Auto-generated method stub
		if(state==IN_NOTHING)
		{
			if(name.equals("properties"))
			{
				state=IN_DOCUMENT;
			}
			else {
				throw new SAXException("attemp to find properties");
			}
		}
		else if(state==IN_DOCUMENT)
		{
			if(name.equals("propertylist"))
			{
				state=IN_DOCUMENT;
				key=atts.getValue("name");
				if(key==null)
				{
					throw new SAXException("no name for key "+atts);
				}
			}
			else if(name.equals("property"))
			{
				state=IN_KEY;
				key=atts.getValue("name");
				if(key==null)
				{
					throw new SAXException("no name for key "+atts);
				}
			}
			else
			{
				throw new SAXException("attemp to find keys");
			}
		}
		else
		{
			throw new SAXException("invalid element "+name);
		}
	}

	@Override
	public void endElement(String name) throws SAXException {
		// TODO Auto-generated method stub
		if(state==IN_KEY)
		{
			xmlprop.setProperty(key, value.toString());
			System.out.println("<key name=\""+key+"\">");
			System.out.println(value.toString()+"</key>\n");
			state=IN_DOCUMENT;
			name=null;
			value=new StringBuffer();
		}
		else if(state==IN_DOCUMENT)
		{
			state=IN_NOTHING;
		}

	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		if(state==IN_KEY)
		{
			compute(ch,start,length);
		}
	}
	public void compute(char[] ch,int start,int length)
	{
		int st=start;
		int len=length-1;
		while(st<length && ((ch[st]==‘\n‘)||(ch[st]==‘\t‘)||(ch[st]==‘ ‘)||(ch[st]==‘\r‘)))
			st++;
		while(len>0 && ((ch[len]==‘\n‘)||(ch[len]==‘\t‘)||(ch[len]==‘ ‘)||(ch[len]==‘\r‘)))
			len--;
		while(st<=len)
		{
			value.append(ch[st]);
			st++;
		}
	}
	@Override
	public void ignorableWhitespace(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void processingInstruction(String target, String data)
			throws SAXException {
		// TODO Auto-generated method stub

	}

}

测试类源代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;

import org.xml.sax.SAXException;

public class TestXML
{
	public static void main(String[] args) throws IOException, SAXException
	{
		XMLProperties xml=new XMLProperties();
		xml.load(new File("D:\\data\\testXml.xml"));
		Enumeration keyEnumeration=xml.keys();
		Enumeration valueEnumeration=xml.elements();
		while(keyEnumeration.hasMoreElements())
		{
			String key=(String)keyEnumeration.nextElement();
			String value=(String)valueEnumeration.nextElement();
			System.out.println(key+"="+value);
			OutputStream out=new FileOutputStream(new File("D:\\data\\out.xml"));
			xml.save(out, "test");
		}

	}
}

测试需要的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "D:\data\xmlproperties.dtd">
<!--XML Wrapper for Properties-->
<properties>
<propertylist name="mylist">
<property name="name">
webendshaere
</property>
<property name="website">
www.webendshaere.com
</property>
<property name="email">
[email protected]
</property>
<property name="techsupport">
[email protected]
</property>
</propertylist>
</properties>

测试需要的xmlproperties.dtd文件

<?xml version="1.0" encoding="UTF-8"?>
  <!ELEMENT properties (#PCDATA|property)*>
  <!ELEMENT key (#PCDATA)>
  <!ATTLIST key name CDATA #IMPLIED>
时间: 2024-12-05 07:17:44

把xml文件转成properties类型----适配器模式的应用的相关文章

Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题

默认情况下产生的Mapper.xml里面存在: 需要修改generatorConfiguration.xml,里面的table加属性,如: <table domainObjectName="User" tableName="test_user"> <columnOverride column="address" javaType="java.lang.String" jdbcType="VARCHA

xml文件 加载properties文件的两种方法与注意事项

1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException  和   java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx'  , 找了很久都找不到原因,文件路径和键名都没写错,加载语法也没有写错...这就很难受了. 直到检查web.xml文件,,我猜测,是不是因为 springcontext-*.x

springmvc加载xml文件读取本地properties配置文件

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以让XML定义档负责系统相关设定,而.properties档可 以作为客户根据需求,自定义一些相关的参数.实际上,PropertyPlaceholderConfigurer起的作用就是将占位符指向的数据库配置 信息放在bean中定义的工具. (1)使用以下方式读取单个本地文件

spring 框架的xml文件如何读取properties文件数据

第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/db.

通过python将xml文件转换成html文件

#数据类型的转换 def main():    maxwidth = 100  #用于规范字段的长度    print_start()    count=0    while True:        try:            line =input()            if count == 0:                color = 'lightgreen'            elif count % 2: #取余                color = 'wh

XStream将xml文件拼成字符串

1.引入的包 <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.7</version> </dependency> 2.代码如下 import java.util.List; import com.thoughtworks.xstream.annotatio

简单实体类和xml文件的相互转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

VB.NET 将JSON格式的字符串保存到XML文件中

1.关于本文 这几天打算写一个工具类JsonXmlHelper,用来进行用XML来保存JSON格式文件的工作.该工具类中要实现2个最主要的函数: 1)将JSON格式的内容写入到地址为address的XML中:WriteJsonToXml 2)把函数1中构造的XML文件恢复成JSON格式文档:RecoverJsonFromXml 函数1的实现将在本文中给出,函数2的实现将在以后发表的博文中给出 2.代码说明 1)添加引用:Newtonsoft.Json.dll 2)导入库 'JSON解析相关函数,