Analyse XML à partir d'un flux d'entrée de Java
Salut tout le monde travaille actuellement sur une application qui a besoin de parser un document xml afin d'authentifier les utilisateurs.Suis en utilisant la classe URLConnection de l'java.net.* package de se connecter à une URL spécifique qui donne un renvoie sa réponse au format xml. Lorsque j'essaie d'analyser le document à l'aide de jdom , j'obtiens l'erreur suivante:
org.jdom2.input.JDOMParseException: Error on line 1: Premature end of file
Quelqu'un peut-il identifier le problème et m'aider avec un remède? merci, voici une partie de mon code
try {
String ivyString = "http://kabugi.hereiam.com/?username=" + ivyUsername + "&password=" + ivyPassword;
URL authenticateURL = new URL(ivyString);
URLConnection ivyConnection = authenticateURL.openConnection();
HttpURLConnection ivyHttp = (HttpURLConnection) ivyConnection;
System.out.println("Response code ==>" + ivyHttp.getResponseCode());
if (ivyHttp.getResponseCode() != 200) {
ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid username or password!", ""));
page = "confirm.xhtml";
} else {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(ivyConnection.getInputStream()));
String inline = "";
while ((inline = inputReader.readLine()) != null) {
System.out.println(inline);
}
SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build(ivyConnection.getInputStream());
Element rootNode = document.getRootElement();
List list = rootNode.getChildren("data");
for (int i = 0; i < list.size(); i++) {
Element node = (Element) list.get(i);
System.out.println("Element data ==>" + node.getChildText("username"));
System.out.println("Element data ==>" + node.getChildText("password"));
}
page = "home.xhtml";
}
} catch (Exception ex) {
ex.printStackTrace();
//ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid username or password!", ""));
}
- Le problème peut être tout simplement que les données retournées par le inputStream est mal formaté en XML - avez-vous vérifié le contenu réel?
- Comme l'a indiqué @mattb, le contenu, la récupération ne peut pas être un document XML valide. Pour analyser les pages HTML, vous pouvez utiliser un moyen plus souple de la bibliothèque, par exemple JSoup, voir: jsoup.org
- Ou vous pouvez utiliser les API fluent "RestAssured" ou un autre projet appelé "RestEasy"...
- b merci pour la réponse rapide, lorsque je visite le lien sur mon navigateur, le fichier xml semble être bien formé!
- Il n'est pas rare pour certains services en vue de produire des données différentes selon le "client". Vous avez besoin de "décharger" le contenu de la URLConnection pour s'assurer que ce que vous voyez dans un navigateur est le même que ce que le serveur envoie à votre navigateur application.
- Dans le code de la lecture des flux à deux reprises. Si vous voulez regarder le flux de données, vous devez le lire dans une chaîne, de l'imprimer, puis de créer un nouveau
InputStream
autour d'unStringReader
à la main sur l'analyseur syntaxique. - vous avez effectivement résolu mon problème!!!!!
- débarrassé de BufferedReader inputReader = new BufferedReader(new InputStreamReader(ivyConnection.getInputStream())); String inline=""; while((inline=inputReader.readLine())!=null){ System.out.println(inline); } everythin est maintenant ok!
- Vous pouvez trouver un FilteredInputStream utile pour le débogage d'un jour.
Vous devez vous connecter pour publier un commentaire.
Ressemble à son parce que vous êtes la lecture de l'inputstream deux fois. Une fois à l'imprimer et le prochain pour créer le document. Lorsque vous arrivez au point où vous générez de l'objet Document, le flux d'entrée est déjà lire et à sa fin. Essayez le code suivant qui lit le flux qu'une seule fois
J'ai eu un problème similaire à cela avant. Si c'est un non compressé connexion HTTP, vous pouvez packet tracer les paquets à l'aide de Wireshark. Ce que vous trouverez probablement du fait qu'il est inattendu XML en-tête de NOMENCLATURE (autre problème) au début de la réponse XML de données. Cela pourrait se produire, par exemple, si l'adresse HTTP de la bibliothèque que vous utilisez ne prend pas en charge http chunking ou le xml est un mauvais encodage.
Nous ne saurons pas jusqu'à ce que vous analyser le trafic à l'aide d'un renifleur de paquets et d'identifier la NOMENCLATURE de l'en-tête (ou de l'absence d'une NOMENCLATURE d'en-tête). En tout cas, si il y a un problème, vous pouvez pirater le flux de compte pour l'en-tête de NOMENCLATURE.
À l'aide de sax parser vous pouvez lire les
inputstream
.Ici
ParseCustomer
est l'analyse de classe qui va lire le fichier xml. Compte tenu de l'échantillon est: