java.net.MalformedURLException: nessun protocollo


173

Ricevo un'eccezione Java come:

java.net.MalformedURLException: no protocol

Il mio programma sta cercando di analizzare una stringa XML utilizzando:

Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(xml);

La stringa XML contiene:

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";

Qualche suggerimento su cosa sta causando questo errore?


Dove stai ricevendo esattamente quel messaggio di errore? Durante l'analisi dell'XML o durante il tentativo di inviarlo tramite la rete? Sarebbe davvero strano se lo capissi durante l'analisi.
Jesper,

Risposte:


369

La documentazione potrebbe essere d'aiuto: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Il metodo DocumentBuilder.parse(String)accetta un URI e tenta di aprirlo. Se vuoi dare direttamente il contenuto, devi dargli un InputStreamo Reader, ad esempio un StringReader. ... Benvenuti nei livelli standard indiretti di Java!

Fondamentalmente :

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

Nota che se leggi il tuo XML da un file, puoi dare direttamente l' Fileoggetto a DocumentBuilder.parse().

Come nota a margine, questo è un modello che incontrerai molto in Java. Di solito, la maggior parte delle API funziona con gli stream più che con le stringhe. L'uso di Stream significa che potenzialmente non tutto il contenuto deve essere caricato in memoria contemporaneamente, il che può essere una grande idea!


2
@Guillaume, facendo ciò ottengo document = null. Perché succede?
HenioJR,

1
Nessuna idea senza guardare il codice. Forse il tuo contributo non è valido e in qualche modo ingerisci eccezioni ...
Guillaume,

Questa riga di codice richiede molto tempo per l'esecuzione. Qualche modo per migliorare le prestazioni?
Raj Shah,

1
+1 per me supponendo (stupidamente, ovviamente) che il parametro stringa doveva essere analizzato dall'xml per l'analisi .... Certo, ha perfettamente senso aspettarsi un URI invece ...
nterry

@RajShah Dovresti eseguire questa logica solo all'avvio, quindi un colpo a tempo maggiore non dovrebbe importare. Non dovresti cambiare la configurazione molto spesso, neanche ....
nterry

24

Prova invece di db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.