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?
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!
Essayez au lieu de db.parse(xml)
:
Document doc = db.parse(new InputSource(new StringReader(**xml**)));