java. net. MalformedURLException: aucun protocole
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?
2 answers
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 donner un InputStream
ou Reader
, par exemple un StringReader
. ... Bienvenue sur les niveaux standards Java des indirections !
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'objet File
à DocumentBuilder.parse()
.
En note de côté, c'est un modèle que vous rencontrerez beaucoup en Java. Habituellement, la plupart des API fonctionnent avec des flux plus qu'avec des chaînes. L'utilisation de 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 !
Essayez au lieu de db.parse(xml)
:
Document doc = db.parse(new InputSource(new StringReader(**xml**)));