2010-11-04 57 views
7

當我嘗試運行我的java程序(它應該讀取一個xml文件並打印出一些內容)時,出現以下錯誤。Java XML處理實體問題?

從我的理解有一個未參考的實體,它不是XML標準的一部分,所以我的問題是;我該如何解決這個問題?

感謝,

[Fatal Error] subject.xml:4:233: The entity "rsquo" was referenced, but not declared. 
org.xml.sax.SAXParseException: The entity "rsquo" was referenced, but not declared. 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
at DomParserExample2.parseXmlFile(DomParserExample2.java:42) 
at DomParserExample2.runExample(DomParserExample2.java:24) 
at DomParserExample2.main(DomParserExample2.java:115) 
Exception in thread "main" java.lang.NullPointerException 
at DomParserExample2.parseDocument(DomParserExample2.java:54) 
at DomParserExample2.runExample(DomParserExample2.java:27) 
at DomParserExample2.main(DomParserExample2.java:115) 

回答

6

實體’不是XML實體。它定義在HTML中:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

如果您創建了XML,則可以將實體添加到您的DTD。

事情是這樣的人能幫助:http://gv.ca/dtd/character-entities.dtd

編輯: 要解決這個問題,你可以在DTD添加到您的XML文件(如果尚未定義)。

你的XML:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE demo SYSTEM "./demo.dtd"> 
<demo> 
    &rsquo; 
</demo> 

您的DTD:

<!ELEMENT demo (#PCDATA)> 
<!ENTITY rsquo "&#8217;"> 

如果您提供的DTD到你的應用程序,錯誤消失。我不會寫自己的實體Entity,我會使用來自W3C的一個http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent

如何爲您的XML包含DTD是另一個問題。據我記得,你可以設置路徑到DTD或目錄文件。

編輯2: 看看的的EntityResolver: http://download.oracle.com/javase/1.4.2/docs/api/org/xml/sax/EntityResolver.html

+0

這樣的可能性我應該將<!ENTITY rsquo「’>>行添加到我的xml文檔中,並且我的問題將消失? – 2010-11-04 10:38:43

+1

我已將更多信息添加到我的答案中 – 2010-11-04 11:19:39

0
/** 
     * This Inner class is written to solve the XML parsing DTD validation 
     * checking from online because if Internet is not connected, then it 
     * throws Exception. 
     * 
     * @author Ravi Thapa 
     */ 




public class CustomEntityResolver implements EntityResolver 
    { 
     public InputSource resolveEntity(String publicId, String systemId) 
     { 
      InputSource source = null; 
      Pattern pattern1 = 
        Pattern.compile("^-//(.*)//DTD(.*)$", Pattern.CASE_INSENSITIVE); 
      Matcher match1 = pattern1.matcher(publicId.trim()); 

      Pattern pattern2 = 
        Pattern.compile("^http://(.*).dtd$", Pattern.CASE_INSENSITIVE); 
      Matcher match2 = pattern2.matcher(systemId.trim()); 
      if (match1.find() || match2.find()) 
      { 
       source = new InputSource(new ByteArrayInputStream("".getBytes())); 
      } 

      // return null to signal default behavior 
      return source; 
     } 
    } 
3

隨着基督教的回答,你也有你的實體聲明對進入XML

<!DOCTYPE your_type [ 
    <!ENTITY rsquo "&#8217;"> 
    <!ENTITY lsquo "&#8216;"> 
]>