java中的SAX解析XML文件的具体步骤基本分为五部:
1.获取解析器factory
2.通过factory获取sax解析器3.获取读取器
4.注册事件处理器
5.解析xml文件
具体代码如下:
public void saxDomXml() throws ParserConfigurationException,SAXException,IOException
{
//1.获取解析器factory
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.通过factory获取sax解析器
SAXParser sp=factory.newSAXParser();
//3.获取读取器
XMLReader xmlReader=sp.getXMLReader();
//4.注册事件处理器
//xmlReader.setContentHandler(new MyContentHandler());
//xmlReader.setContentHandler(new MyContentHandler2());
//5.解析xml文件
xmlReader.parse("../MyXml.xml");
}
下面这个类实现了ContentHandler这个接口,该接口默认的方法太多,一般的解析用不到,而且一旦调用了该接口里面的方法会全部实现,过于冗余繁琐。这个类实现的功能就是将一个XML文件完整的解析出来
//快捷键 Alt shift S 调出实现类的方法
class MyContentHandler implements ContentHandler{
/**
* ch 数组为整个xml文件的内容
* start 当前标签提从哪个标签开始
* length 标签体长度
* */
public void characters(char[] ch, int start, int length)
throws SAXException {
// 打印从ch数组里的start位置上取length个长度
System.out.println("----打印标签内容---"+new String(ch,start,length));
}
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("解析开始");
}
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("解析结束");
}
public void startElement(String uri, String localName, String name,
Attributes arg3) throws SAXException {
// TODO Auto-generated method stub
System.out.println("开始标签"+name);
}
/**
* name 传入的标签名
*
* **/
public void endElement(String uri, String localName, String name)
throws SAXException {
// TODO Auto-generated method stub
}
public void setDocumentLocator(Locator arg0) {
// TODO Auto-generated method stub
}
public void skippedEntity(String arg0) throws SAXException {
// TODO Auto-generated method stub
}
public void startPrefixMapping(String arg0, String arg1)
throws SAXException {
// TODO Auto-generated method stub
}
public void endPrefixMapping(String arg0) throws SAXException {
// TODO Auto-generated method stub
}
public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
throws SAXException {
// TODO Auto-generated method stub
}
public void processingInstruction(String arg0, String arg1)
throws SAXException {
// TODO Auto-generated method stub
}
}//MyContentHandler
下面这个类继承自类DefaultHandler,该类实现EntityResolver, DTDHandler, ContentHandler, ErrorHandler这几个接口,不过类中方法没有做操作,当我们需要做具体的解析要求时,比如说只解析某个特定标签,或者只解析哪一个内容这种方式就很方便。
//适配器模式
/**
* 自定义特定的方法,例如只需要打印某个特定的标签、或者只打印第几个标签
* */
class MyContentHandler2 extends DefaultHandler{
private String eleName=null;
private int count=0;
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, name, attributes);
this.eleName=name;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
//只打印标签为书名的内容,即所有的关于标签是"书名"的内容全部打印出来
if ("书名" .equals(eleName)) {
System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));
}
//只想打印第二个标签的内容
if ("书名" .equals(eleName) && ++count==2) {
System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, name);
eleName=null;
}
}//MyContentHandler2
XML文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "../book.dtd">
<书架>
<书>
<书名>java</书名>
<作者>XX</作者>
<售价>14</售价>
</书>
<书>
<书名>C++</书名>
<作者>SS</作者>
<售价>14</售价>
</书>
</书架>
.dtd文件内容
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>