java.net.MalformedURLException: pas de protocole

173

Je reçois une exception Java comme:

java.net.MalformedURLException: no protocol

Mon programme essaie d'analyser une chaîne XML en utilisant:

Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(xml);

La chaîne XML contient:

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
    "   <s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
    "       <s:Header>"+
    "           <ActivityId CorrelationId=\"15424263-3c01-4709-bec3-740d1ab15a38\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\">50d69ff9-8cf3-4c20-afe5-63a9047348ad</ActivityId>"+
    "           <clalLog_CorrelationId xmlns=\"http://clalbit.co.il/clallog\">eb791540-ad6d-48a3-914d-d74f57d88179</clalLog_CorrelationId>"+
    "       </s:Header>"+
    "       <s:Body>"+
    "           <ValidatePwdAndIPResponse xmlns=\"http://tempuri.org/\">"+
    "           <ValidatePwdAndIPResult xmlns:a=\"http://schemas.datacontract.org/2004/07/ClalBit.ClalnetMediator.Contracts\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
    "           <a:ErrorMessage>Valid User</a:ErrorMessage>"+
    "           <a:FullErrorMessage i:nil=\"true\" />"+
    "           <a:IsSuccess>true</a:IsSuccess>"+
    "           <a:SecurityToken>999993_310661843</a:SecurityToken>"+
    "           </ValidatePwdAndIPResult>"+
    "           </ValidatePwdAndIPResponse>"+
    "       </s:Body>\n"+
    "   </s:Envelope>\n";

Des suggestions sur la cause de cette erreur?

JJJ
la source
Où obtenez-vous exactement ce message d'erreur? En analysant le XML ou en essayant de l'envoyer sur le réseau? Ce serait vraiment étrange si vous obtenez cela lors de l'analyse.
Jesper
dupliqué? stackoverflow.com/questions/964311/…
Fernando Gonzalez Sanchez

Réponses:

369

La documentation pourrait vous aider: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

La méthode DocumentBuilder.parse(String)prend un URI et essaie de l'ouvrir. Si vous voulez donner directement le contenu, vous devez lui donner un InputStreamou Reader, par exemple un StringReader. ... Bienvenue dans les niveaux standard des indirections Java!

Fondamentalement :

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new StringReader(xml)));

Notez que si vous lisez votre XML à partir d'un fichier, vous pouvez directement donner l' Fileobjet à DocumentBuilder.parse().

En remarque, c'est un modèle que vous rencontrerez souvent en Java. Habituellement, la plupart des API fonctionnent plus avec les flux qu'avec les chaînes. L'utilisation de Streams signifie que tout le contenu ne doit pas être chargé en mémoire en même temps, ce qui peut être une excellente idée!

Guillaume
la source
2
@Guillaume, en faisant cela, j'obtiens document = null. Pourquoi cela arrive-t-il?
HenioJR
1
Aucune idée sans regarder le code. Peut-être que votre entrée est invalide et que vous avalez l'exception d'une manière ou d'une autre ...
Guillaume
Cette ligne de code prend du temps à s'exécuter. Un moyen d'améliorer les performances?
Raj Shah
1
+1 pour moi en supposant (bêtement, bien sûr) que le paramètre de chaîne était censé être analysé par le xml .... Bien sûr, il est parfaitement logique d'attendre un URI à la place ....
nterry
@RajShah Vous ne devriez exécuter cette logique qu'au démarrage, donc un coup plus long ne devrait pas avoir d'importance. Vous ne devriez pas non plus avoir à changer la configuration très souvent ...
nterry
24

Essayez au lieu de db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Shyam_coder
la source