📄 mysaxpa.ja
字号:
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 + -