java代码
package parseXmlDoc;
public class SaxXmlParse {
public static void main(String[] args) {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
XMLDTDValidator validator = new XMLDTDValidator();
try {
parserFactory.setValidating(true);
SAXParserImpl saxParse = (SAXParserImpl)parserFactory.newSAXParser();
SaxXmlParse xmlParse = new SaxXmlParse();
DefaultHandler defaultHandler = xmlParse.new myHandle();
saxParse
.parse(new File("src/parseXmlDoc/test.xml"), defaultHandler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } private class myHandle extends DefaultHandler {
public void startDocument() throws SAXException {
System.out.println("文档开始");
} public void endDocument() throws SAXException {
System.out.println("文档结束");
} public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
System.out.println("元素开始" + "--->" + name);
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getValue(i));
}
} public void endElement(String uri, String localName, String name)
throws SAXException {
System.out.println("元素结束" + "--->" + name);
} @Override
public void error(SAXParseException e) throws SAXException {
e.printStackTrace();
} @Override
public void warning(SAXParseException e) throws SAXException {
e.printStackTrace();
} @Override
public void fatalError(SAXParseException e) throws SAXException {
e.printStackTrace();
}
}
}
xml代码   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM   "src/parseXmlDoc/test.dtd">
<students>
<student name="" /></students>dtd代码<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % String "CDATA">
<!ELEMENT students (student)>
<!ELEMENT student EMPTY > 
<!ATTLIST student name %String; #REQUIRED>
<!ATTLIST student age  %String; #IMPLIED>
<!ATTLIST student sc   %String; #REQUIRED>
 如果我用XMLReader来解析这个xml文档,就是对的,用这里的SAXParse就报错 ,错误如下
java.net.MalformedURLException: no protocol: src/parseXmlDoc/test.dtd

解决方案 »

  1.   

    问题补充:为什么把SAXParserFactory 设置setValidation(true) ,不会对dtd验证
      

  2.   

    话很有歧义,不好回答!
    DTD可以成为验证的根据。
      

  3.   

    可能URL地址错了。
    试试写成:file:/src/parseXmlDoc/test.dtd
      

  4.   

    应该不是,我xml 的SYSTEM的 dtd声明有加file://的吗??
      

  5.   

    楼主的代码我调试了一下可以运行,主要改了以下几个地方
    1,test.xml 和 test.dtd 在同一目录下,应该改成
    <!DOCTYPE students SYSTEM "test.dtd">
    2,根据test.dtd sc属性是REQUIRED,所以必须要把这个加上
    <student name="xxx" sc="xxx"/>
    其他的没有变动,请楼主在检查一遍吧