EntityResolver界面非常简单,resolveEntity方法只需要简单地查看提供的公用和系统的标识符,然后返回一个指向实体值的InputSource。使用一个InputSource允许你通过StringReader提供一个简单的字符串值。
我们的句柄名为MySAXHandler,如表D所示。表E显示了运行名为EntityResolverExample程序的范例,程序通过 XMLReader界面执行SAX分解器。我们已经动态地简化了SAX句柄,它包含ContentHandler界面中的主要执行部分,这一界面只是显示了每一成分和相关字符数据的开始和结束部分。
表D: MySAXHandler.java
import org.xml.sax.*;
import java.io.*;
public class MySAXHandler implements ContentHandler {
public void setDocumentLocator(Locator locator) {}
public void startDocument() throws SAXException {}
public void endDocument() throws SAXException {}
public void startPrefixMapping(String prefix, String uri)
throws SAXException {}
public void endPrefixMapping(String prefix) throws
SAXException {}
public void startElement(String namespaceURI, String
localName, String qualifiedName, Attributes atts) throws
SAXException {
System.out.println("Starting element: " + localName);
}
public void endElement(String namespaceURI, String
localName, String qualifiedName) throws SAXException {
System.out.println("Ending element: " + localName);
}
public void characters(char[] text, int start, int
length) throws SAXException {
String data = new String(text);
System.out.println(data.substring(start, start +
length));
}
public void ignorableWhitespace(char[] text, int start,
int length) throws SAXException {}
public void processingInstruction(String target, String
data) throws SAXException {}
public void skippedEntity(String name) throws
SAXException {}
}
表E: EntityResolverExample.java
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class EntityResolverExample {
public static void main (String[] args) {
XMLReader parser;
MySAXHandlermsh;
CustomResolvermyResolver = new CustomResolver();
try {
parser = XMLReaderFactory.createXMLReader();
msh = new MySAXHandler();
parser.setContentHandler(msh);
parser.setEntityResolver(myResolver);
parser.parse("entity.xml");
} catch (Exception e) {
System.out.println (e);
}
}
}
EntityResolverExample类使用XMLReaderFactory通过XMLReader界面建立一个新的SAX分解器。然后我们在通用内容句柄中设置内容句柄,在通用实体解答器中设置实体解答器。最后,我们分解XML文档,可以看到成分的名称和已分解实体的值,如下所示:
Starting element: Entity
Starting element: CustomEntity
Resolving entity: -//Builder.com//TEXT MyCustomEntity//EN
This is a custom entity
Ending element: CustomEntity
Ending element: Entity
本文作者 :Brian Schaffnerj是日本Fujitsu(富士通)咨询的副董事。他为Fujitsu技术咨询应用提供了体系,设计,及开发支持。
