-- 作者:ncki
-- 发布时间:10/4/2007 2:22:00 AM
-- 一个很奇怪的问题 用DOM开发xml 文件时,居然不能解析带外部DTD的xml(我快要爆炸了)
源码: 01: package org.nc.xml.xmlparse; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Entity; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Notation; public class ParseDocType { public static void show(Document document){ DocumentType documentType = document.getDoctype(); if(documentType != null){ System.out.println("dtd Name :"+ documentType.getName()); System.out.println("dtd public id :"+ documentType.getPublicId()); System.out.println("dtd system id :"+ documentType.getSystemId()); System.out.println("dtd internal subset :"+ documentType.getInternalSubset()); System.out.println(); NamedNodeMap entities = documentType.getEntities(); for(int i = 0 ;i<entities.getLength();i++){ Entity entity = (Entity)entities.item(i); System.out.println("entity name : "+entity.getNodeName()); System.out.println("notation name : " + entity.getNotationName()); System.out.println("entity public id : " + entity.getPublicId()); System.out.println("entity system id : " + entity.getSystemId()); System.out.println(); } NamedNodeMap notations = documentType.getNotations(); for(int i = 0 ;i<notations.getLength();i++){ Notation notation = (Notation)notations.item(i); System.out.println("notation name : "+notation.getNodeName()); System.out.println("notation public id : "+notation.getPublicId()); System.out.println("notation name : "+notation.getSystemId()); System.out.println(); } } } public static void main(String[] args) { Document document = new XMLParse("src/students.xml").getDocument(); ParseDocType.show(document); } } 02: package org.nc.xml.xmlparse; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XMLParse { private Document document; public XMLParse(String xmlFileName){ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder docmentBuilder = documentBuilderFactory.newDocumentBuilder(); this.document = docmentBuilder.parse(new File(xmlFileName)); } catch (ParserConfigurationException ex) { ex.printStackTrace(); } catch (SAXException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } public Document getDocument() { return document; } } 测试用例: package org.nc.xml.test; import org.nc.xml.xmlparse.XMLParse; org.nc.xml.xmlparse.ParseDocType; import org.w3c.dom.Document; public class TestCase extends junit.framework.TestCase { public void testParseDocType() { Document document = new XMLParse("src/students.xml").getDocument(); ParseDocType.show(document); } xml文档: students.xml <?xml version="1.0" encoding="gb2312" standalone="yes"?> <!DOCTYPE students[ <!ELEMENT students (student+)> <!ELEMENT student (Name,Department,Class,Course+)> <!ATTLIST student ID CDATA #REQUIRED> <!ELEMENT Name (#PCDATA)> <!ELEMENT Department (#PCDATA)> <!ELEMENT Class (#PCDATA)> <!ELEMENT Course (CName,ExamDate,Teacher,CMark,CTime,CType,Score)> <!ELEMENT CName (#PCDATA)> <!ELEMENT ExamDate (#PCDATA)> <!ELEMENT Teacher (#PCDATA)> <!ELEMENT CMark (#PCDATA)> <!ELEMENT CTime (#PCDATA)> <!ELEMENT CType (#PCDATA)> <!ELEMENT Score (#PCDATA)> ]> <students> <student ID="103220533"> <Name>studentsOne</Name> <Department>计算机系</Department> <Class>网通班</Class> <Course> <CName>Java</CName> <ExamDate>2006-12-29</ExamDate> <Teacher>nameOne</Teacher> <CMark>6</CMark> <CTime>96</CTime> <CType>主修</CType> <Score>88</Score> </Course> </student> </students> 如果你把内部DTD 放到外部文件中 然后用<!DOCTYPE students "-//nc//STUNET 1.0//CH" "students.dtd"> 在xml文件中声明。。。。然后测试你会得到如下的错误: java.net.MalformedURLException: no protocol: students.dtd at java.net.URL.<init>(URL.java:567) at java.net.URL.<init>(URL.java:464) at java.net.URL.<init>(URL.java:413) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:968) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:905) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:872) at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:282) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(XMLDocumentScannerImpl.java:1021) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292) at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:172) at org.nc.xml.xmlparse.XMLParse.<init>(XMLParse.java:27) at org.nc.xml.test.TestCase.testParseDocType(TestCase.java:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 哪个大虾看看我是怎么错的
|