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
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
DTD可以成为验证的根据。
试试写成:file:/src/parseXmlDoc/test.dtd
1,test.xml 和 test.dtd 在同一目录下,应该改成
<!DOCTYPE students SYSTEM "test.dtd">
2,根据test.dtd sc属性是REQUIRED,所以必须要把这个加上
<student name="xxx" sc="xxx"/>
其他的没有变动,请楼主在检查一遍吧