problème de l'entité de traitement Java XML?
-
28-09-2019 - |
Question
je reçois l'erreur suivante lorsque je tente de lancer mon programme java (il est censé lire un fichier xml et imprimer une partie du contenu).
D'après ce que je crois comprendre qu'il ya une entité qui est non référencé ne fait pas partie de la norme xml donc ma question est; comment puis-je résoudre ce problème?
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)
La solution
Le ’
d'entité est une entité XML. Son défini dans HTML: http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Si vous avez créé le XML, vous pouvez ajouter Entitys vous 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 non défini).
Votre XML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE demo SYSTEM "./demo.dtd">
<demo>
’
</demo>
Votre DTD:
<!ELEMENT demo (#PCDATA)>
<!ENTITY rsquo "’">
Si vous fournissez la DTD à votre application, l'erreur disparaît. Je n'écrirais pas alle me Entités mises, j'utiliser un du W3C http: //www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
Comment inclure la DTD pour votre XML est une autre question. Pour autant que je me rappelle que vous pouvez définir le chemin de la DTD ou un catalogue de fichiers.
modifier2: Jetez un oeil à la EntityResolver: http://download.oracle.com /javase/1.4.2/docs/api/org/xml/sax/EntityResolver.html
Autres conseils
Suite à 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 "’">
<!ENTITY lsquo "‘">
]>
/**
* 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;
}
}