2010-11-04 3 views
7

Je reçois l'erreur suivante lorsque j'essaie d'exécuter mon programme Java (il est supposé lire un fichier XML et imprimer une partie du contenu). D'après ce que je comprends, il y a une entité non référencée qui ne fait pas partie de la norme xml donc ma question est; comment puis-je résoudre ce problème?Problème d'entité de traitement Java XML?

Merci,

[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) 

Répondre

6

L'entité ’ est pas un XML-entité. Son défini en HTML: http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Si vous avez créé le XML, vous pouvez ajouter des Entités à votre DTD.

Quelque chose comme celui-ci pourrait aider: http://gv.ca/dtd/character-entities.dtd

modifier: Pour résoudre ce problème, vous pouvez ajouter une DTD à votre fichier XML (si pas déjà défini).

Votre XML:

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

Votre DTD:

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

Si vous fournissez la DTD à votre application, l'erreur disparaît. Je ne voudrais pas écrire les Entités moi-même, je voudrais utiliser un de W3C http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent

Comment inclure la DTD pour votre XML est une autre question. Aussi loin que je me souvienne, vous pouvez définir le chemin vers la DTD ou un fichier catalogue.

modifier 2: Jetez un oeil à la EntityResolver: http://download.oracle.com/javase/1.4.2/docs/api/org/xml/sax/EntityResolver.html

+0

si devrais-je ajouter la ligne à mon document xml et mes problèmes disparaîtront? –

+1

J'ai ajouté plus d'informations à ma réponse –

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

Après la réponse de Christian, vous avez également la possibilité de déclarer vos entités directement dans le XML

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