59 votes

java.net.MalformedURLException : pas de protocole

J'obtiens 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";

Avez-vous des suggestions sur la cause de cette erreur ?

149voto

Guillaume Points 8549

La documentation peut 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 InputStream, par exemple un ByteArrayInputStream. ... Bienvenue dans les niveaux d'indirections de la norme Java !

Fondamentalement :

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8"))));

Notez que si vous lisez votre XML depuis un fichier, vous pouvez directement donner l'objet File à DocumentBuilder.parse().

À titre d'information, il s'agit d'un modèle que vous rencontrerez souvent en Java. En général, la plupart des API utilisent davantage les flux que les chaînes de caractères. L'utilisation des flux signifie que, potentiellement, tout le contenu ne doit pas être chargé en mémoire en même temps, ce qui peut être une excellente idée !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X