générateur de rapports.parse (new StringReader(xml)) renvoie DeferredDocumentImpl
J'essaie de comprendre quelle erreur j'aurais fait, mais ne peut pas trouver la solution.
public static Document getXMLFromString(String xml) { org.le w3c.dom.Le Document doc = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); usine.setNamespaceAware(true); DocumentBuilder builder; builder = factory.newDocumentBuilder(); doc = (org.le w3c.dom.Document) du générateur.parse(new InputSource( nouveau StringReader(xml))); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } retour doc; }
Je n'import org.le w3c.dom.Document
Je suis à l'appel de cette méthode ici:
privé Nœud getAuthToken(SOAPMessage responseAuth) throws SOAPException, TransformerException, ParserConfigurationException, IOException, SAXException { String s = indentXML(responseAuth.getSOAPPart().getContent()); Le Document doc = getXMLFromString(s); NodeList authTokenNodeList = doc.getElementsByTagName("authToken"); retour authTokenNodeList.item(0); }
La NodeList est vide.
Après mes recherches sur le web, tout le monde utilise ce code pour parser une chaîne de caractères dans un Document. Je n'ai pas l'exception, mais, après l'appel de la méthode parse(), la valeur de la doc est réglé sur [document#: null] DeferredDocumentImpl.
Je suis en utilisant tout de le org.le w3c.dom.
xml est une chaîne qui contient
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<context xmlns="urn:zimbra">
<session id="36" type="admin">36</session>
<change token="251"/>
</context>
</soap:Header>
<soap:Body>
<AuthResponse xmlns="urn:zimbraAdmin">
<authToken>...</authToken>
<lifetime>...</lifetime>
<a n="zimbraIsDomainAdminAccount">false</a>
<session id="36" type="admin">36</session>
</AuthResponse>
</soap:Body>
</soap:Envelope>
Voici comment j'ai construit la chaîne après un appel SOAP:
Chaîne xml = indentXML(responseAuth.getSOAPPart().getContent());
Ce que je fais mal?
C'est ce que je suis en train d'essayer de le faire d'une manière simple:
StringBuilder soapResponse = new StringBuilder(... ... ... ); org.le w3c.dom.Le Document doc = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); usine.setNamespaceAware(true); DocumentBuilder builder; builder = factory.newDocumentBuilder(); doc = (org.le w3c.dom.Document) du générateur.parse(new InputSource( nouveau StringReader(soapResponse.toString()))); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } NodeList authTokenNodeList = doc.getElementsByTagName("authToken"); Nœud n = authTokenNodeList.item(0); String s = n.getNodeValue();
Pourrais-tu nous montrer le code complet de votre importation comme Jon Skeet a dit dans sa réponse
Juste édité mon message, je vous remercie pour votre aide les gars, je ne comprends vraiment pas quel est le problème.
si le XML est à partir d'un fichier, avez-vous essayé de le lire à partir du fichier en utilisant la méthode parse??
Le XML est celui que j'ai reçu après avoir fait un appel SOAP. Chaîne xml = indentXML(responseAuth.getSOAPPart().getContent());
OriginalL'auteur user393381 | 2011-06-17
Vous devez vous connecter pour publier un commentaire.
EDIT: en Regardant votre code mis à jour, je pense que c'est le problème:
Si vous regardez la documentation pour Nœud vous verrez que
getNodeValue()
est défini pour revenirnull
pour les éléments... d'où le problème. Mon exemple de code utilisegetTextContent()
au lieu de cela, ce qui fonctionne très bien.Il semble que cela va juste pour reporter l'expansion des objets en mémoire jusqu'à ce que vous en avez besoin.
Avez-vous essayé d'appeler des méthodes sur le document retourné plutôt que de juste regarder dans le débogueur? Je soupçonne que tout est fait comme prévu. Si non, merci de poster un court mais complète programme qui montre défaillante. (Notez que dans l'exemple que vous avez donné, vous n'avez même pas montré comment
builder
est réglé et que vous n'avez pas utiliséfactory
.)EDIT: Le code que vous avez donné fonctionne pour moi. Voici un rapide et sale - mais, surtout, complète - programme (à l'aide de Goyave pour charger le fichier XML dans une chaîne de caractères) qui montre le nœud être trouvé avec succès:
Oui j'ai essayer d'appeler le getElementsByTagName() la méthode, avec une balise d'élément que je sais qu'il existe.
Non, s'il vous plaît poster une courte mais complète du programme - quelque chose que je peux compiler et exécuter, qui va montrer le problème.
Maintenant, j'ai mis à jour ma réponse avec une courte mais complète du programme de mon propre. Vous pouvez essayer...
Skeet: Vous aviez raison à propos de tout. Comme vous l'avez soupçonné, il a été fonctionne correctement déjà, et j'ai été en utilisant le getNodeValue() au lieu de getTextContent(). Le contenu du texte est ce que je veux, j'essaye de faire la différence entre les deux.
OriginalL'auteur Jon Skeet