Question

J'ai le XML suivant:

<?xml version="1.0" encoding="UTF-8"?>
<details>
  ...
  <address1>Test&amp;Address</address1>
  ...
</details>

Lorsque j'essaie de le désarracher en utilisant JAXB, il lance l'exception suivante:

Caused by: org.xml.sax.SAXParseException: The reference to entity "Address" must end with the ';' delimiter.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:194)

Mais quand j'ai changé le &amp; dans le XML à &apos;, Ça marche. On dirait que le problème est uniquement avec Ampersand &amp; Et je ne comprends pas pourquoi.

Le code pour unmarshal est:

JAXBContext context = JAXBContext.newInstance("some.package.name", this.getClass().getClassLoader());
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = unmarshaller.unmarshal(new StringReader(xml));

Quelqu'un a-t-il un aperçu?

Edit: j'ai essayé la solution suggérée par @ abhin4v ci-dessous (c'est-à-dire, ajouter un espace après &amp;), mais cela ne semble pas fonctionner aussi. Voici le StackTrace:

Caused by: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:194)
Était-ce utile?

La solution 3

Il s'avère que le problème est dû au cadre que j'utilise (Cadre de mentawai). Ledit XML vient du corps post d'une demande HTTP.

Apparemment, le cadre convertit les entités de caractère du corps XML, donc, &amp; devient & Et le Unmarshaller ne parvient pas à démaditer le XML.

Autres conseils

J'ai rencontré ça aussi. Tout d'abord, j'ai simplement remplacé la chaîne de jeton (ampersand_token), je l'ai envoyée via JAXB, puis j'ai répété l'ampesand. Pas idéal, mais c'était une solution rapide.

Deuxième passe, j'ai apporté beaucoup de changements importants, donc je ne sais pas exactement ce qui a résolu le problème. Je soupçonne que fournir un accès JAXB aux DTD HTML le rendait beaucoup plus heureux, mais ce n'est qu'une supposition et pourrait être spécifique à mon projet.

Hth

Xerces convertit &amp; à & puis essaie de résoudre &Address ce qui échoue car il ne se termine pas ;. Mettre un espace entre & et Address Et cela devrait fonctionner. Mettre un espace ne fonctionnera pas car Xerces essaiera maintenant de résoudre & et lancer la deuxième erreur donnée dans OP. Vous pouvez effectuer le test dans une section CDATA et Xerces n'essaiera pas de résoudre les entités.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top