Comment annuler une réponse SOAP à l'aide de JAXB si la déclaration d'espace de noms est sur l'enveloppe SOAP?
JAXB ne peut unmarshall XML si l'enveloppe soap a déjà été supprimé. Cependant, la réponse SOAP je suis en train de unmarshall a sa déclaration d'espace de noms sur l'enveloppe soap. Si je retire l'enveloppe soap, la déclaration d'espace de noms sera également supprimé. En tant que tel le préfixe de les étiquettes, se référant à aucun. Cela provoque JAXB lever une erreur. Comment puis-je unmarshall un SAVON réponse à l'aide de JAXB si l'espace de noms est déclaré sur l'enveloppe SOAP?
Un semblable exemple de XML que j'ai besoin de unmarshall est ci-dessous:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://example.com/">
<soapenv:Body>
<ns:getNumberResponse>
<number>123456789</number>
</ns:getNumberResponse>
</soapenv:Body>
</soapenv:Envelope>
C'est ce qui arrive si je retire l'enveloppe soap:
<ns:getNumberResponse>
<number>123456789</number>
</ns:getNumberResponse>
Si j'ai enlevé l'enveloppe soap, la déclaration d'espace de noms sera également disparu. JAXB ne sera pas en mesure de unmarshall ci-dessus xml, car la définition d'espace de noms pour le préfixe "ns" est manquant. En tant que tel, il sera de retour d'une "The prefix "ns" for element "ns:getNumberResponse" is not bound."
message d'erreur. Comment puis-je résoudre ce problème?
Veuillez noter que je suis à l'aide du JDK 1.5. Je ne sais pas si il existe un moyen de résoudre ce JDK 1.6. J'ai été en mesure d'utiliser JAXB, car j'ai téléchargé le nécessaire les pots à l'aide de JAXB.
source d'informationauteur Arci
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un StAX analyseur de parser le message SOAP, puis avancer le
XMLStreamReader
à lagetNumberResponse
élément et utiliser le unmarshal méthode qui prend un paramètre classe. Un StAX analyseur est inclus dans Java SE 6, mais vous aurez besoin de télécharger un pour Java SE 5. Woodstox est un populaire StAX analyseur.Réponse
Démo
Un
XMLStreamReader
a unNamespaceContext
. LeNamespaceContext
sait toutes les déclarations d'espace de noms pour le niveau actuel. Votre JAXB (JSR-222) la mise en œuvre sera en mesure de tirer parti de cela pour obtenir les informations nécessaires.Sortie
Vous pu analyser l'ensemble du message SOAP à l'aide d'un DOM parser, qui serait en mesure de résoudre tous les espaces de noms au moment de l'analyse. Puis extraire l'élément que vous avez besoin à partir de la résultante arborescence DOM et passer à la unmarshaller.
DomDemo
Sortie