以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML基础 』  (http://bbs.xml.org.cn/list.asp?boardid=1)
----  一个很奇怪的问题 用DOM开发xml 文件时,居然不能解析带外部DTD的xml(我快要爆炸了)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=1&rootid=&id=53366)


--  作者: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)


哪个大虾看看我是怎么错的


--  作者:ncki
--  发布时间:10/4/2007 6:37:00 PM

--  
怎么每人回一个!!自己顶一下
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
562.500ms