⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparser.java

📁 java与模式 一书的源码
💻 JAVA
字号:
package com.javapatterns.xmlproperties;

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

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

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 ex)
        {
            throw new RuntimeException("Unable to intantiate : "+ PARSER_P);
        }
    }

	XMLParser(InputStream in, XMLProperties xmlprop) throws IOException, SAXException
	{
        this.xmlprop = xmlprop;

	    state = IN_NOTHING;
	    value = new StringBuffer();
	    try
        {
			parser = getParser();
			parser.setDocumentHandler(this);
		    parser.parse(new InputSource(in));
	    }
        catch (Exception e)
        {
			e.printStackTrace();
			throw new SAXException("can't create parser ");
	    }                                                      
	}

	public void startElement(String name, AttributeList atts) throws SAXException
	{
	    if (state == IN_NOTHING)
        {
			if (name.equals("properties"))
	        {
			    state = IN_DOCUMENT;
			}
	        else
	        {
			    throw new SAXException("attempt to find root properties");
			}
	    }
        else if (state == IN_DOCUMENT)
        {
			if (name.equals("key"))
	        {
			    state = IN_KEY;
			    key = atts.getValue("name");
			
			    if (key == null)
	            {
					throw new SAXException("no name for key "+atts);
			    }
			}
	        else
	        {
			    throw new SAXException("attempt to find keys");
			}
	    }
        else
        {
			throw new SAXException("invalid element "+name);
	    }
	}

	public void endElement(String name) throws SAXException
	{
	    if (state == IN_KEY)
        {
			xmlprop.setProperty(key, value.toString());

		    System.out.print("<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;
	    }
	}

	public void characters(char[] ch, int start, int length)
	    throws SAXException 
	{
	    if (state == IN_KEY)
        {
			compute(ch, start, length);
	    }
	}

	public void ignorableWhitespace(char[] ch, int start, int length)
	    throws SAXException 
	{
	    // nothing to do
	}

	public void startDocument() throws SAXException
	{
	    // nothing to do
	}

	public void endDocument() throws SAXException
	{
	    // nothing to do
	}

	public void processingInstruction(String target, String data)
	    throws SAXException 
	{
	    // nothing to do
	}

	public void setDocumentLocator(Locator locator)
    {
	    // nothing to do
	}

	private 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++;
	    }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -