web-dev-qa-db-fra.com

java.net.MalformedURLException: pas de protocole

Je reçois une exception Java comme:

Java.net.MalformedURLException: no protocol

Mon programme tente 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 ce qui cause cette erreur?

156
user206641

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 InputStream ou Reader, par exemple un StringReader. ... Bienvenue dans les Java niveaux standard de indirections!

Fondamentalement :

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

Notez que si vous lisez votre code XML à partir d'un fichier, vous pouvez directement attribuer l'objet File à DocumentBuilder.parse().

En passant, c’est un motif que vous rencontrerez beaucoup en Java. Habituellement, la plupart des API fonctionnent avec des flux plus qu'avec des chaînes. Utiliser Streams signifie que potentiellement tout le contenu ne doit pas nécessairement être chargé en mémoire en même temps, ce qui peut être une excellente idée!

336
Guillaume

Essayez au lieu de db.parse(xml):

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