2009-11-10 5 views
131

Je reçois comme exception Java:java.net.MalformedURLException: aucun protocole

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 la cause de cette erreur?

+0

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 ceci en analysant. – Jesper

Répondre

283

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 tente de l'ouvrir. Si vous voulez donner directement le contenu, vous devez lui donner un InputStream, par exemple un ByteArrayInputStream. ... Bienvenue aux niveaux d'indirections Java standard!

En gros:

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

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

En remarque, c'est un patron que vous rencontrerez beaucoup en Java. Généralement, la plupart des API fonctionnent avec des flux plus qu'avec des 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 bonne idée!

+7

+1 pour les niveaux d'adresse indirects Java –

+1

@Guillaume, ce qui fait que je reçois document = null. Pourquoi cela arrive-t-il? – HenioJR

+0

Aucune idée sans regarder le code. Peut-être que votre entrée est invalide et que vous avalez une exception en quelque sorte ... – Guillaume

18

Essayez plutôt de db.parse(xml):

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