2010-06-08 9 views
16

Lorsque vous essayez d'analyser XML incorrect avec une référence de caractère tels que &#x1, SAX Java meurt d'une mort horrible avec une erreur fatale, commeComment dire à Java SAX Parser d'ignorer les références de caractères invalides?

org.xml.sax.SAXParseException: Character reference "&#x1" 
            is an invalid XML character. 

Y at-il moyen de contourner cela? Devrai-je nettoyer le fichier XML avant de le remettre à l'analyseur SAX? Si oui, y a-t-il une manière élégante de s'y prendre?

Répondre

20

Utilisez XML 1.1! Skaffman a tout à fait raison, mais vous pouvez simplement coller <?xml version="1.1"?> sur le dessus de vos fichiers et vous serez en bonne forme. Si vous traitez des flux, écrivez un wrapper qui réécrit ou ajoute cette instruction de traitement.

+0

wow, ça marche. Y a-t-il des inconvénients ou des problèmes de compatibilité avec l'utilisation de xml 1.1? – Epaga

+0

consultez le "Raison d'être et la liste des changements pour XML 1.1" à http://www.w3.org/TR/xml11/#sec-xml11 Si je me souviens bien, tout document xml 1.0 valide est valide en XML 1.1 – wowest

+0

puisque cela continue à être utile pour les gens, un grand raccourci pour ajouter cet en-tête est: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PushbackInputStream.html#unread (octet []) – wowest

7

Vous allez devoir nettoyer votre XML, j'en ai peur. De tels caractères ne sont pas valables selon la spécification XML, et aucune persuasion ne convaincra l'analyseur autrement.

Valid XML characters XML 1.0:

  • U+0009
  • U+000A
  • U+000D
  • U+0020 - U+D7FF
  • U+E000-U+FFFD
  • U+10000 - U+10FFFF

Pour nettoyer, vous devrez passer les données par un processeur plus bas niveau, qui le traite comme un flux de caractères unicode, la suppression de ces caractères qui ne sont pas valides.

+0

seul problème est que je devrais faire le décodage des entités de caractères moi-même ... bummer. – Epaga

2

Ceci est un code XML non valide, donc aucun parseur ne devrait l'analyser sans erreur. Mais vous rencontrez un tel XML invalide fabriqué à la main dans le monde réel. Ma solution consiste à insérer manuellement des marqueurs CDATA aux données. Par exemple,

<data><![CDATA[ garbage with &invalid characters ]]></data> 

Bien sûr, vous obtiendrez les données de retour comme il est et vous devez vous-même traiter les caractères non valides.

+2

Non. Les caractères invalides ne sont toujours pas valides dans les sections CDATA. –

+3

S'il vous plaît vérifier le fait avant que vous downvote. La référence de caractère dans CDATA est traitée comme une chaîne normale. Même si "& # x1" représente une référence invalide, elle est composée de tous les caractères valides. Je fais cela tout le temps avec plusieurs parseurs donc je sais que j'ai raison. –