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

📄 mysaxpa.ja

📁 java操作xml文件的各种代码
💻 JA
📖 第 1 页 / 共 2 页
字号:
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * <code>MySAXParser</code>可以从命令行下读入一个XML文件并且
 *使用SAX标准的机制来分析该文件。
 *
 * @author <a href="mailto:james@eknow.com.tw">王景浩</a>
 * @version 0.3
 */

public class MySAXParser{

	/**
	 *<p>
	 *我们将在这里使用标准的SAX的处理机制(handler)来处理XML
	 *文件
	 *</p>
	 *
	 * @param uri 欲分析的XML文件的URI
	 */

	public void parseXML(String uri) {
		try{
			System.out.println("正在分析中的XML文件: " + uri + "\n");
			
			XMLReader parser =
                		XMLReaderFactory.createXMLReader(
                    		"org.apache.xerces.parsers.SAXParser");

			
			//XMLReader parser = new SAXParser();
			//注册我们所设计的内容处理器
			parser.setContentHandler(new MyContentHandler());
			//注册我们的错误处理器
			parser.setErrorHandler(new MyErrorHandler());
			//分析文件
			parser.parse(uri);

		} catch(IOException ioe){
			System.out.println("文件读取错误:"+ioe.getMessage());
		} catch(SAXException saxe){
			System.out.println("XML分析错误: "+saxe.getMessage());
		}
	}

	/**
	 *<p>
	 *主程序使用命令列的参数来指定所要分析的XML文件
	 *</p>
	 */

	public static void main(String[] args) {
		//如果参数数目不对,则输出使用说明,并结束程序
		if( args.length != 1 ){
			System.out.println("请输入欲分析的文件名: " +
					   "java example3_1 [XML URI]");
			System.exit(-1);
		}

		String uri = args[0];
		MySAXParser myParser = new MySAXParser();
		myParser.parseXML(uri);
	}
}

/**
 *<code>MyContentHandler</code>实做<code>org.xml.sax.
 *ContentHandler</code>界面,并且提供提供相关的回调方法。
 *所有和XML文件内容有关的分析处理都是在这里解决。
 */


class MyContentHandler implements ContentHandler {

	/**保留Locator对象的信息*/
	private Locator locator;

    /**
     *提供一个<code>Locator</code>对象来表示某事件发生在原本
     *文件的何处。
     *<p>
     *所有其他回调函数在被调用时都会更新<code>Locator</code>
     *对象,以表示最新的值。要注意的是,在分析的过程中,
     *<code>Locator</code>对象一直都会保持著最新的值,但是当
     *分析的工作(<code>parse()</code>)做完后,它的值就变成没
     *有意义的东西,千万不要在分析以外的时候去访问它。
     *</p>
     *
     * @param locator 一个可以回报任何SAX事件位置的对象。
     *
     * @see org.xml.sax.Locator
     */
    public void setDocumentLocator (Locator locator){
    	System.out.println("设置Locator对象..");
    	//把SAX的Locator对象放到到我们自己的Locator对象里
    	this.locator = locator;
    }


    /**
     *接受文件开始的调用
     *
     *<p>
     *在使用SAX分析器时,这个函数是除了
     *{@link #setDocumentLocator setDocumentLocator}以外第一
     *个被调用的。在分析一份XML文件时,只会调用本函数一次。
     *和其他定义在<code>ContentHandler</code>的函数一样,
     *<code>startDocument</code>在遇到错误时会发回一个
     *SAXException对象
     *</p>
     *
     * @exception org.xml.sax.SAXException   任何的SAX异常,
     *有可能是封装过的其他异常处理
     *
     * @see #endDocument
     */
    public void startDocument ()
	throws SAXException{
		System.out.println("文件分析开始->");
	}


    /**
     *接受文件结束调用
     *<p>
     * SAX分析器只会调用这个函数一次,同时会是在分析的过程里
     *最后被调用。一般来说,只有在两种状况下分析器会调用本函
     *式,一个是放弃了分析程序,有可能是是分析器遇到了它无法
     *恢复的错误,另一种情况则是遇到输入数据的结束。
     *</p>
     *
     * @exception org.xml.sax.SAXException   任何的SAX异常,
     *有可能是封装过的其他异常处理
     *
     * @see #startDocument
     */
    public void endDocument()
	throws SAXException{
		System.out.println("<-文件分析结束");
	}


    /**
     *命名空间声明的开始
     *
     *<p>
     *其实由这个函数所提供的信息,对于一般的命名空间处理来说,
     *是不常用到的,因为只要把<code>http://xml.org/sax/
     *features/namespaces</code>这个功能设置为真(默认为真),
     *那么SAX的XML reader就会自动地把元素命名空间的前置符号
     *替换调。
     *</p>
     *
     * @param prefix 该元素所声明的命名空间
     * @param uri 该命名空间所对应到的统一资源标识符
     * @exception org.xml.sax.SAXException   任何的SAX异常,
     *有可能是封装过的其他异常处理
     * @see #endPrefixMapping
     * @see #startElement
     */
    public void startPrefixMapping (String prefix, String uri)
	throws SAXException{
		System.out.println( "命名空间对应开始->" +
							"第" + locator.getLineNumber() + "行" +
							"\n\t命名空间前导符: " + prefix +
							"\n\t相对应的统一资源标识符: " + uri);
	}


    /**
     *命名空间声明的结束
     *
     *<p>
     *这个事件永远都会在元素结束事件发生之后发生。
     *</p>
     *
     * @param prefix 该命名空间所对应到的前导字符串
     * @exception org.xml.sax.SAXException   任何的SAX异常,
     *有可能是封装过的其他异常处理
     *的其他异常处理
     * @see #startPrefixMapping
     * @see #endElement
     */
    public void endPrefixMapping (String prefix)
	throws SAXException{
		System.out.println(	"<-命名空间对应结束" );
	}



    /**
     *接受元素开始的调用
     *
     *<p>
     *每一个元素在开始时都会产生这个调用,除了该元素的名称和
     *命名空间外,它的属性也会一同地传入。不过有一些具有特定
     *用途的属性则不会被传入,如<code>xmlns:</code>和
     *<code>xsi:</code>
     *</p>
     *
     *<p>
     *一个元素的名称一共会被分成三个部分来传入:
     *</p>
     *
     *<ol>
     * <li>命名空间的统一资源标识符</li>
     *<li>原始名称</li>
     *<li>加上命名空间的原始名称,也就是新名称</li>
     *</ol>
     *
     * @param uri 命名空间的统一资源标识符。当该元素没有名称
     *空间时或是分析器没有启动命名空间功能时,此字符串就会为空
     * @param localName 没有前置字符串的元素名称。如果分析器没
     *有启动命名空间功能时,此字符串为空。
     * @param qName 完整的元素名称。如果新名称如法取得时,此
     *字符串为空。
     * @param atts  附加在这个元素上的全部属性。如果该元素没
     *有任何属性,则会返回一个空的Attributes对象。注意,不是
     *空(null)。
     *
     * @exception org.xml.sax.SAXException 任何的SAX异常,有
     *可能是封装过的其他异常处理
     * @see #endElement
     * @see org.xml.sax.Attributes
     */
    public void startElement (String namespaceURI, String localName,
			      String qName, Attributes atts)
	throws SAXException{
		//打印元素名称
		System.out.print("元素开始: " + localName);

		if(namespaceURI.equals("")) {

⌨️ 快捷键说明

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