100分,继续问.用SaxParser解析XML时如何获得被解析XML文档的DOCTYPE ?
rt
比如
<?xml version="1.0"?>
<!DOCTYPE XmlEmployees SYSTEM "./DTD/Employees.dtd">
<XmlEmployee>
..........
用sax解析这个文档,如何获得"./DTD/Employees.dtd"这个字符串?
有没有这个事件的处理函数?
问题点数:0、回复次数:4Top
1 楼usabcd(9号公路上的3名共军)回复于 2004-09-03 15:29:53 得分 0
这个有一点麻烦哦。
你写的自己的handler 除了要implements ContentHandler外还要implements LexicalHandler
handler中实现startDTD()方法
System.out.println(systemId); //这个systemId就时你要的东西
在解析时:
xmlReader.setContentHandler(handler);
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
xmlReader.parse("test.xml");
Top
2 楼XIHSHI(西红柿)回复于 2004-09-04 15:58:00 得分 0
去找个好的例子看看Top
3 楼DaveX(秋水长滩)回复于 2004-10-12 18:07:53 得分 0
同意2楼的。
摘录自sun的一个例子,应该对你有帮助
import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.ext.LexicalHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
public class Echo12 extends DefaultHandler implements LexicalHandler {
static private Writer out;
StringBuffer textBuffer;
private String indentString = " "; // Amount to indent
private int indentLevel = 0;
public static void main(String[] argv) {
if (argv.length != 1) {
System.err.println("Usage: cmd filename");
System.exit(1);
}
// Use an instance of ourselves as the SAX event handler
Echo12 handler = new Echo12();
// Use the validating parser
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
//factory.setNamespaceAware(true);
try {
// Set up output stream
out = new OutputStreamWriter(System.out, "UTF8");
// Parse the input
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",
handler);
saxParser.parse(new File(argv[0]), handler);
} catch (SAXParseException spe) {
// Error generated by the parser
System.out.println("\n** Parsing error" + ", line " +
spe.getLineNumber() + ", uri " + spe.getSystemId());
System.out.println(" " + spe.getMessage());
// Use the contained exception, if any
Exception x = spe;
if (spe.getException() != null) {
x = spe.getException();
}
x.printStackTrace();
} catch (SAXException sxe) {
// Error generated by this application
// (or a parser-initialization error)
Exception x = sxe;
if (sxe.getException() != null) {
x = sxe.getException();
}
x.printStackTrace();
} catch (ParserConfigurationException pce) {
// Parser with specified options can't be built
pce.printStackTrace();
} catch (IOException ioe) {
// I/O error
ioe.printStackTrace();
} catch (Throwable t) {
t.printStackTrace();
}
System.exit(0);
}
//===========================================================
// SAX DocumentHandler methods
//===========================================================
public void setDocumentLocator(Locator l) {
// Save this to resolve relative URIs or to give diagnostics.
try {
out.write("LOCATOR");
out.write("\n SYS ID: " + l.getSystemId());
out.flush();
} catch (IOException e) {
// Ignore errors
}
}
public void startDocument() throws SAXException {
nl();
nl();
emit("START DOCUMENT");
nl();
emit("<?xml version='1.0' encoding='UTF-8'?>");
}
public void endDocument() throws SAXException {
nl();
emit("END DOCUMENT");
try {
nl();
out.flush();
} catch (IOException e) {
throw new SAXException("I/O error", e);
}
}
... to be continuedTop
4 楼DaveX(秋水长滩)回复于 2004-10-12 18:08:53 得分 0
public void startElement(String namespaceURI, String sName, // simple name
String qName, // qualified name
Attributes attrs) throws SAXException {
echoText();
indentLevel++;
nl();
emit("ELEMENT: ");
String eName = sName; // element name
if ("".equals(eName)) {
eName = qName; // not namespaceAware
}
emit("<" + eName);
if (attrs != null) {
for (int i = 0; i < attrs.getLength(); i++) {
String aName = attrs.getLocalName(i); // Attr name
if ("".equals(aName)) {
aName = attrs.getQName(i);
}
nl();
emit(" ATTR: ");
emit(aName);
emit("\t\"");
emit(attrs.getValue(i));
emit("\"");
}
}
if (attrs.getLength() > 0) {
nl();
}
emit(">");
}
public void endElement(String namespaceURI, String sName, // simple name
String qName // qualified name
) throws SAXException {
echoText();
nl();
emit("END_ELM: ");
String eName = sName; // element name
if ("".equals(eName)) {
eName = qName; // not namespaceAware
}
emit("</" + eName + ">");
indentLevel--;
}
public void characters(char[] buf, int offset, int len)
throws SAXException {
String s = new String(buf, offset, len);
if (textBuffer == null) {
textBuffer = new StringBuffer(s);
} else {
textBuffer.append(s);
}
}
public void ignorableWhitespace(char[] buf, int offset, int len)
throws SAXException {
// Ignore it
}
public void processingInstruction(String target, String data)
throws SAXException {
nl();
emit("PROCESS: ");
emit("<?" + target + " " + data + "?>");
}
//===========================================================
// SAX ErrorHandler methods
//===========================================================
// treat validation errors as fatal
public void error(SAXParseException e) throws SAXParseException {
throw e;
}
// dump warnings too
public void warning(SAXParseException err) throws SAXParseException {
System.out.println("** Warning" + ", line " + err.getLineNumber() +
", uri " + err.getSystemId());
System.out.println(" " + err.getMessage());
}
//===========================================================
// LexicalEventListener methods
//===========================================================
public void comment(char[] ch, int start, int length)
throws SAXException {
}
public void startCDATA() throws SAXException {
echoText(); // echo anything we've seen before now
nl();
emit("START CDATA SECTION");
}
public void endCDATA() throws SAXException {
echoText(); // echo the CDATA text
nl();
emit("END CDATA SECTION");
}
public void startEntity(java.lang.String name) throws SAXException {
echoText(); // echo anything we've seen before now
nl();
emit("START ENTITY: " + name);
}
public void endEntity(java.lang.String name) throws SAXException {
echoText(); // echo the ENTITY text
nl();
emit("END ENTITY: " + name);
}
public void startDTD(String name, String publicId, String systemId)
throws SAXException {
nl();
emit("START DTD: " + name + "\n publicId=" + publicId +
"\n systemId=" + systemId);
}
public void endDTD() throws SAXException {
nl();
emit("END DTD");
}
//===========================================================
// Utility Methods ...
//===========================================================
// Display text accumulated in the character buffer
private void echoText() throws SAXException {
if (textBuffer == null) {
return;
}
nl();
emit("CHARS: ");
String s = "" + textBuffer;
if (!s.trim()
.equals("")) {
emit(s);
}
textBuffer = null;
}
// Wrap I/O exceptions in SAX exceptions, to
// suit handler signature requirements
private void emit(String s) throws SAXException {
try {
out.write(s);
out.flush();
} catch (IOException e) {
throw new SAXException("I/O error", e);
}
}
// Start a new line
// and indent the next line appropriately
private void nl() throws SAXException {
String lineEnd = System.getProperty("line.separator");
try {
out.write(lineEnd);
for (int i = 0; i < indentLevel; i++)
out.write(indentString);
} catch (IOException e) {
throw new SAXException("I/O error", e);
}
}
}
Top




